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 |
要移位的位数。正数右移,负数左移:允许的值为 |
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 rawConnection 原始连接
- R raw 原始向量
- R rank 样本排名
- R rapply 递归地将函数应用于列表
- R range 值范围
- R readRenviron 从文件设置环境变量
- R remove 从指定环境中删除对象
- R readChar 与连接之间传输字符串
- R rep 复制向量和列表的元素
- R readRDS 单个对象的序列化接口
- R reg.finalizer 对象的最终确定
- R row 行索引
- R row.names 获取和设置 DataFrame 的行名称
- R rowsum 根据分组变量给出矩阵或 DataFrame 的列和
- R rev 反转元素
- R rle 游程长度编码
- R regmatches 提取或替换匹配的子字符串
- R readline 从终端读取一行
- R round.POSIXt 舍入/截断日期时间对象
- R readBin 与连接之间传输二进制数据
- R replace 替换向量中的值
- R readLines 从连接读取文本行
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Convert to or from (Bit/Packed) Raw Vectors。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。