首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java byte 數組聲明三種寫法深度解析:二進制、十六進制、十進制互轉

     編輯:Java 相關知識

前言

在網絡編程、二進制協議解析、加密算法、硬件通訊等場景中,byte[] 是核心數據載體。Java 中 byte 是有符號 8 位整數(-128~127),但實際業務常需處理無符號字節值(0~255)。本文系統梳理三種字面量寫法、有符號/無符號轉換陷阱、調試可視化技巧與最佳實踐。

一、三種字面量寫法等價性


// 同一個 byte 數組的三種寫法
byte[] arr1 = { (byte)0b00010110, (byte)0b01010010, (byte)0b10111000 }; // 二進制 (Java 7+)
byte[] arr2 = { 0x16, 0x52, (byte)0xB8 };                                  // 十六進制
byte[] arr3 = { 22, 82, -72 };                                             // 十進制(有符號視角)

數值驗證

二進制十六進制無符號十進制有符號十進制 (Java byte)
0001 01100x162222
0101 00100x528282
1011 10000xB8184-72 (184-256)

核心結論:JVM 內存中存儲的位模式完全相同,只是字面量書寫與調試顯示視角不同。

二、有符號 byte 的「顯示陷阱」

現象

byte b = (byte) 0xB8; // 184
System.out.println(b); // 輸出 -72

原理

  • Java byte 是有符號類型,最高位為符號位
  • 0xB8 = 1011 1000,符號位為 1 → 負數
  • 補碼表示:-72 = 256 - 184

調試時的視覺誤導

  • Eclipse/IDEA 變量面板默認顯示有符號十進制(-128~127)
  • 實際網絡傳輸/文件存儲的位模式完全正確,無需擔心

三、無符號字節值獲取:標準姿勢

// 錯誤:直接用 byte 參與運算會符號擴展
int wrong = b + 10; // -72 + 10 = -62

// 正確:& 0xFF 強制無符號擴展為 int
int correct = (b & 0xFF) + 10; // 184 + 10 = 194

// 通用工具方法
public static int toUnsigned(byte b) {
    return b & 0xFF;
}

public static byte fromUnsigned(int val) {
    if (val < 0 || val > 255) throw new IllegalArgumentException("超出 byte 無符號範圍");
    return (byte) val;
}

四、進制轉換速查表

轉換方向代碼示例說明
byte → 十六進制字符串String.format("%02X", b & 0xFF)大寫、補零兩位
byte[] → Hex 字符串Hex.encodeHexString(bytes) (Apache Commons Codec)生產首選
Hex 字符串 → byte[]Hex.decodeHex(hexString)自動處理大小寫
byte → 二進制字符串String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0')補零 8 位

五、實戰場景:網絡協議構建

// 構建定長二進制報文:魔數(2B) + 版本(1B) + 命令(1B) + 長度(4B) + 體
ByteBuffer buf = ByteBuffer.allocate(1024).order(ByteOrder.BIG_ENDIAN);
buf.putShort((short) 0xABCD);      // 魔數
buf.put((byte) 0x01);              // 版本
buf.put((byte) 0x03);              // 命令
buf.putInt(payload.length);        // 長度 (網絡序大端)
buf.put(payload);                  // 體
byte[] packet = new byte[buf.position()];
System.arraycopy(buf.array(), 0, packet, 0, buf.position());

六、總結

  • 三種寫法本質等價,按可讀性選擇:協議文檔常用十六進制,位運算用二進制,通用數值用十進制
  • 牢記 b & 0xFF 獲取無符號值,是處理二進制數據的黃金法則
  • 調試時關注內存位模式而非有符號顯示值
  • 生產代碼優先用 ByteBuffer、DatagramPacket、Netty ByteBuf 等高級抽象,減少手工位操作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved