我想將2個字節移入一個短。這2個字節表示一個無符號的短路,它反過來表示一個端口。我已經嘗試了多種方法將這些字節轉換爲java中的簡短字符。但是,我經常無法正確地做到這一點。Java移位字節返回一個意外的結果
這是我試過的方法:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
結果是0xFFCC,但應該是0x17CC。
我想將2個字節移入一個短。這2個字節表示一個無符號的短路,它反過來表示一個端口。我已經嘗試了多種方法將這些字節轉換爲java中的簡短字符。但是,我經常無法正確地做到這一點。Java移位字節返回一個意外的結果
這是我試過的方法:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
結果是0xFFCC,但應該是0x17CC。
在Java中進行算術運算的任何值首先被轉換爲可覆蓋兩個操作數的較高類型。如果它們仍然較小,則兩個操作數都被轉換爲int
。
因此,b
首先投射到int
並變成0xFFFFFFCC
。或者任何向左偏移8位的東西始終保持掩碼0xFFFFFF00
,因此對結果沒有影響。將它縮短就會縮小左邊的16位。
要解決這個問題,做術前與0xFF
明確面膜:
(short)(((a&0xFF)<<8)|(b&0xFF))
//試試這個,因爲你不能從int轉換爲字節:
short a = 0x17;
short b = 0xCC;
System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));
//輸出:r = 0x17CC
謝謝你,終於有用! :)閱讀完它後,確實有很多的意義.. – Max