2

我需要读取一个对 long 进行编码的二进制文件。我只举一个多头作为例子。

# don't know a simpler way to create the raw vector
z <- writeBin(c(8L, 208L, 59L, 233L, 106L, 151L, 126L, 73L), raw())
dim(z) <- c(4,8)
z1 <- z[1,]
#[1] 08 d0 3b e9 6a 97 7e 49

向量 z1 是二进制的(例如http://www.asciitohex.com/):

00001000 11010000 00111011 11101001 01101010 10010111 01111110 01001001

这是十进制(java.lang.Long.parseLong(v,2)):

635073421160971849

> readBin(z1, what="integer", size=8, n=1 )
[1] -381956088
> readBin(z1, what="integer", size=8, n=1, endian="big")
[1] 1788313161
#etc...

这不是我想要的。如何从 R 中的原始向量进行转换?

4

2 回答 2

3

这是 hackish、不直截了当、愚蠢等等,但因为我也认为它很有趣,所以我忍不住尝试。既然我试过了,我会发布它。

Joshua 是对的,int64它不支持从raw. 但是,它只是将每个 64 位整数存储为两个 32 位整数,因此您可以raw通过int64将其分成两部分并将每个部分作为整数读取来将其转换为:

> my.long <- int64(1)
> my.long@.Data[[1]] <- c(readBin(z1[1:4], what="integer", endian="big"), readBin(z1[5:8], what="integer", endian="big"))
> my.long
[1] 635073421160971849
于 2013-07-02T20:03:56.710 回答
3

如果您将原始向量转换为字符格式,您可以使用gmp包执行此操作。我在下面的示例中使用了十六进制。

#install.packages("gmp")
library(gmp)
as.bigz(paste0("0x",paste0(as.character(z1),collapse="")))
# Big Integer ('bigz') :
# [1] 635073421160971849
于 2013-07-02T19:27:12.153 回答