在R中将raw转换为long?

时间:2013-07-02 18:17:18

标签: r

我需要读取一个编码longs的二进制文件。我只举一个长篇作为例子。

# 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中的原始矢量进行转换?

2 个答案:

答案 0 :(得分:3)

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

#install.packages("gmp")
library(gmp)
as.bigz(paste0("0x",paste0(as.character(z1),collapse="")))
# Big Integer ('bigz') :
# [1] 635073421160971849

答案 1 :(得分:3)

这是hackish,unstraightforward和愚蠢等等,但是因为我觉得它很有趣,所以我无法抗拒尝试。自从我尝试过,我将发布它。

约书亚是对的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
相关问题