當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。