2011-08-24 86 views
4

我需要通过JRI将原始数据传回给Java,但它不支持原始数据,只支持各种其他矢量类型(如整数)。如何将原始(字节向量)转换为整数向量?如何将`raw`转换为R中的整数向量?

我试着将数据作为字符串的向量传递回去,但是因为JRI不能正确解码字符串(例如'\ x89'被丢弃为“”)而中断了数据。

如果效率更高(取消装箱),效果也不错。 as.integer不起作用 - 它不会返回数组中字符的字节值,更不用说rawToChar为nuls生成“”的事实。

回答

2

rawToChar参见文档:

rawToChar并将其转换为一个字符串或单字节(对于0与“”)一个 字符向量的原始字节。

当然,一旦你设法得到它character,你可以很容易地通过它的方法as.integer转换为整数,但要cautious

+0

我应该提到,我目前将数据送回作为一个字符串矢量(其中每个字符串只包含0或1个字符) - 我一直在寻找的东西更有效(拆箱)。 'as.integer'不起作用 - 它不会返回数组中字符的字节值,更不用说rawToChar为nuls生成“”。 – Yang

2

这个问题很古老,但对于那些(像我一样)在搜索答案时碰到这个问题的人:as.integer(raw.vec)效果很好。

f <- file("/tmp/a.out", "rb") 
seek(f, 0, "end") 
f.size <- seek(f, NA, "start") 
seek(f, 0, "start") 
raw.vec <- readBin(f, 'raw', f.size, 1, signed=FALSE) 
close(f) 
bytes <- as.integer(raw.vec) 
3

进一步考虑这个阶段,您可以直接从原始矢量读取Bin。因此,我们可以:

> raw 
[1] 2b 97 53 eb 86 b9 4a c6 6c ca 40 80 06 94 bc 08 3a fb bc f4 
> readBin(raw, what='integer', n=length(raw)/4) 
[1] -346843349 -968181370 -2143237524 146576390 -188941510