我需要通过JRI将原始数据传回给Java,但它不支持原始数据,只支持各种其他矢量类型(如整数)。如何将原始(字节向量)转换为整数向量?如何将`raw`转换为R中的整数向量?
我试着将数据作为字符串的向量传递回去,但是因为JRI不能正确解码字符串(例如'\ x89'被丢弃为“”)而中断了数据。
如果效率更高(取消装箱),效果也不错。 as.integer
不起作用 - 它不会返回数组中字符的字节值,更不用说rawToChar为nuls生成“”的事实。
我需要通过JRI将原始数据传回给Java,但它不支持原始数据,只支持各种其他矢量类型(如整数)。如何将原始(字节向量)转换为整数向量?如何将`raw`转换为R中的整数向量?
我试着将数据作为字符串的向量传递回去,但是因为JRI不能正确解码字符串(例如'\ x89'被丢弃为“”)而中断了数据。
如果效率更高(取消装箱),效果也不错。 as.integer
不起作用 - 它不会返回数组中字符的字节值,更不用说rawToChar为nuls生成“”的事实。
为rawToChar
参见文档:
rawToChar并将其转换为一个字符串或单字节(对于0与“”)一个 字符向量的原始字节。
当然,一旦你设法得到它character
,你可以很容易地通过它的方法as.integer
转换为整数,但要cautious。
这个问题很古老,但对于那些(像我一样)在搜索答案时碰到这个问题的人: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)
进一步考虑这个阶段,您可以直接从原始矢量读取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
我应该提到,我目前将数据送回作为一个字符串矢量(其中每个字符串只包含0或1个字符) - 我一直在寻找的东西更有效(拆箱)。 'as.integer'不起作用 - 它不会返回数组中字符的字节值,更不用说rawToChar为nuls生成“”。 – Yang