首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android byte 陣列顯示負數問題:正確轉換為無號整數的方法

     編輯:程式設計綜合問答

Java byte 是有號 8 位元 (-128~127),直接列印大於 127 的值會顯示負數。需正確轉換為 0~255 的無號整數值。

錯誤現象

byte[] result = { (byte)0xFF, (byte)0x80, 65 }; // 實際位元模式
for (byte b : result) Log.e("TAG", "byte=" + b);
// 輸出: byte=-1, byte=-128, byte=65

正確轉換:位元 AND 0xFF

for (byte b : result) {
    int unsignedVal = b & 0xFF; // 關鍵:將 byte 先提升為 int,再與 0xFF 位元 AND
    Log.d("TAG", "byte=" + unsignedVal);
}
// 輸出: byte=255, byte=128, byte=65

原理解析

步驟說明
1. b (byte) → intJava 自動符號擴展:0xFF → 0xFFFFFFFF (-1),0x80 → 0xFFFFFF80 (-128)
2. & 0xFF保留低 8 位,高位歸零:0xFFFFFFFF & 0xFF = 0x000000FF (255)

常見誤區

  • Byte.toUnsignedInt(b) (Java 8+):標準庫方法,內部同樣 b & 0xFF,語意更清晰。
  • b + 256:僅對負數有效,正數會變大,錯誤。
  • Math.abs(b):Math.abs(-128) = -128 (溢位),錯誤。

完整範例:十六進位顯示

for (int i = 0; i < result.length; i++) {
    String hex = String.format("%02X", result[i] & 0xFF);
    Log.d("TAG", String.format("byte[%d]=0x%s (%d)", i, hex, result[i] & 0xFF));
}

核心:永遠用 b & 0xFF 或 Byte.toUnsignedInt(b) 取得無號值,不要相信直接列印的 byte。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved