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
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) → int | Java 自動符號擴展: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。