簡體   English   中英

Java移位字節返回意外結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM