2012-08-30 37 views
0

我已經完成了位/字節級的操作,所以請原諒我,如果這很簡單。從字節數組轉換爲短的錯誤負值

我正在通過嵌入式設備的Java應用程序中的TCP套接字接收數據。數據是小端(最低有效字節在前),我目前正試圖從數據陣列中獲取short值。要做到這一點,我用下面的代碼:

byte[] valBytes = {data[0], data[1]}; 
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes); 

也能正常工作正數,但是當short應爲-1,我越來越-2代替。產生-2的數據是:

byte[] valBytes = {(byte)0xff, (byte)0xff}; 
short val = EndianArrayUtils.getShortFromLittleEndianRange(valBytes); 

我錯過了什麼嗎? -1的二進制補碼應該是11111111 11111111是否正確?

編輯

我完全忘了,我是真地寫過EndianArrayUtils之一。對於getShortFromLittleEndianRange方法的代碼是

public static short getShortFromLittleEndianRange(byte[] range){ 
     return (short)((short)(range[1] >> 8) + (short)(range[0])); 
    } 

顯然有什麼毛病怎麼說對負數操作。

+0

從哪兒是EndianArrayUtils?你說得對,-1應該是ffff,我猜這些utils在轉換成short時會失敗。 EndianArrayUtils是否來自某個庫?如果沒有,你可以顯示一些代碼嗎? – Fildor

+0

@Fildor我是個白癡。我很久以前寫過'EndianArrayUtils',並且忘記了它。我曾經認爲這是一個Java類哈哈。讓我得到該代碼併發布。 –

+0

:)這是沒有什麼可以稱自己是一個白癡。這是一個很好的界面,不是嗎? – Fildor

回答

5

我會用字節緩衝區

byte[] valBytes = {(byte)0xff, (byte)0xff}; 
short s = ByteBuffer.wrap(valBytes).order(ByteOrder.LITTLE_ENDIAN).getShort(); 
System.out.println(s); 

打印

-1 

如果你讀入字節緩衝區,你不需要byte[]可言。

要解決你的榜樣

public static short getShortFromLittleEndianRange(byte[] range){ 
    return (short)((range[1] << 8) + (range[0] & 0xff)); 
} 
+0

同意,我剛剛切換到@Fildor後,我發現我自己寫了'EndianArrayUtils'。它似乎比字節移位等慢。這是否準確?有沒有辦法像我這樣做呢? –

+0

使用wrap()更慢。如果你使用ByteBuffer而不是隻使用byte [],那麼速度會更快。 –

相關問題