[英]Java shifting bytes returns an unexpected result
我試圖將2個字節轉換為短消息。 這2個字節表示無符號短路,而后者又代表端口。 我已經嘗試了多種方法將這些字節轉換為簡短的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
,因此對結果沒有影響。 將它轉換為short只會縮小左邊的16位。
要解決它,在執行操作之前使用0xFF
顯式屏蔽:
(short)(((a&0xFF)<<8)|(b&0xFF))
//試試這個,因為你不能從int轉換為byte:
short a = 0x17;
short b = 0xCC;
System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));
//輸出:r = 0x17CC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.