当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R rawConversion 与(位/打包)原始向量之间的转换


R语言 rawConversion 位于 base 包(package)。

说明

"raw" 类型对象的转换和操作,均用作位或 “packed” 8 位。

用法

charToRaw(x)
rawToChar(x, multiple = FALSE)

rawShift(x, n)

rawToBits(x)
intToBits(x)
packBits(x, type = c("raw", "integer", "double"))

numToInts(x)
numToBits(x)

参数

x

要转换或移动的对象。

multiple

逻辑:应该转换为单个字符串还是多个单独的字符?

n

要移位的位数。正数右移,负数左移:允许的值为 -8 ... 8

type

结果类型,部分匹配。

细节

packBits 接受原始、整数或逻辑输入,最后两个没有任何 NA。

numToBits(.)packBits(., type="double") 互为反函数,另请参阅示例。

请注意,‘bytes’ 不一定与字符相同,例如在 UTF-8 语言环境中。

charToRaw 将长度为 1 的字符串转换为原始字节。它这样做时不考虑任何声明的编码(请参阅Encoding)。

rawToChar 将原始字节转换为单个字符串或单个字节的字符向量(使用 "" 表示 0 )。 (请注意,单个字符串可以包含嵌入的 null;仅允许尾随 null 并将被删除。)在任何一种情况下,都可能创建在多字节语言环境中无效的结果,例如一种使用 UTF-8。如果multiple 为真,则允许Long vectors

rawShift(x, n)x 中的位向右移动 n 位置,请参见上面的参数 n

rawToBits 返回的原始向量是条目为 0 或 1 的原始向量长度的 8 倍。 intToBits 返回的原始向量是条目为 0 或 1 的整数向量长度的 32 倍。(非整数数值)被截断为整数。)在这两种情况下,解包都是最低有效位在前。

packBits 将其输入(仅使用原始或整数向量的最低位)将最低有效位首先打包到原始、整数或双精度 (“numeric”) 向量。

numToInts()numToBits()double 精度数值向量拆分为两个 integer 或每个 64 位,存储为 raw 。在这两种情况下,解包都是首先从最不重要的元素开始。

例子

x <- "A test string"
(y <- charToRaw(x))
is.vector(y) # TRUE

rawToChar(y)
rawToChar(y, multiple = TRUE)
(xx <- c(y,  charToRaw("&"), charToRaw(" more")))
rawToChar(xx)

rawShift(y, 1)
rawShift(y,-2)

rawToBits(y)

showBits <- function(r) stats::symnum(as.logical(rawToBits(r)))

z <- as.raw(5)
z ; showBits(z)
showBits(rawShift(z, 1)) # shift to right
showBits(rawShift(z, 2))
showBits(z)
showBits(rawShift(z, -1)) # shift to left
showBits(rawShift(z, -2)) # ..
showBits(rawShift(z, -3)) # shifted off entirely

packBits(as.raw(0:31))
i <- -2:3
stopifnot(exprs = {
  identical(i, packBits(intToBits(i), "integer"))
  identical(packBits(       0:31) ,
            packBits(as.raw(0:31)))
})
str(pBi <- packBits(intToBits(i)))
data.frame(B = matrix(pBi, nrow=6, byrow=TRUE),
           hex = format(as.hexmode(i)), i)


## Look at internal bit representation of ...

## ... of integers :
bitI <- function(x) vapply(as.integer(x), function(x) {
            b <- substr(as.character(rev(intToBits(x))), 2L, 2L)
            paste0(c(b[1L], " ", b[2:32]), collapse = "")
          }, "")
print(bitI(-8:8), width = 35, quote = FALSE)

## ... of double precision numbers in format  'sign exp | mantissa'
## where  1 bit sign  1 <==> "-";
##       11 bit exp   is the base-2 exponent biased by 2^10 - 1 (1023)
##       52 bit mantissa is without the implicit leading '1'
#
## Bit representation  [ sign | exponent | mantissa ] of double prec numbers :

bitC <- function(x) noquote(vapply(as.double(x), function(x) { # split one double
    b <- substr(as.character(rev(numToBits(x))), 2L, 2L)
    paste0(c(b[1L], " ", b[2:12], " | ", b[13:64]), collapse = "")
  }, ""))
bitC(17)
bitC(c(-1,0,1))
bitC(2^(-2:5))
bitC(1+2^-(1:53))# from 0.5 converge to 1

###  numToBits(.)  <==>   intToBits(numToInts(.)) :
d2bI <- function(x) vapply(as.double(x), function(x) intToBits(numToInts(x)), raw(64L))
d2b  <- function(x) vapply(as.double(x), function(x)           numToBits(x) , raw(64L))
set.seed(1)
x <- c(sort(rt(2048, df=1.5)),  2^(-10:10), 1+2^-(1:53))
str(bx <- d2b(x)) # a  64 x 2122  raw matrix
stopifnot( identical(bx, d2bI(x)) )

## Show that  packBits(*, "double")  is the inverse of numToBits() :
packBits(numToBits(pi), type="double")
bitC(2050)
b <- numToBits(2050) 
identical(b, numToBits(packBits(b, type="double")))
pbx <- apply(bx, 2, packBits, type="double")
stopifnot( identical(pbx, x))

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Convert to or from (Bit/Packed) Raw Vectors。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。