2011-08-24 88 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 
相關問題