網路傳輸、序列化、二進位協議處理常需將 int、long 轉為位元組陣列(byte[]),而非字串,以節省頻寬並提升效能。本文提供生產級工具類實作。
採用大端序(Big-Endian,網路位元組序),高位位元組在前,低位在後。關鍵操作:
& 0xFF:將 byte 無符號轉為 int,避免符號位擴展>> / >>>:有符號/無符號右移<<:左移public class ByteOrderUtils {
/** int 轉 byte[4] (大端序) */
public static byte[] int2byte(int res) {
byte[] targets = new byte[4];
targets[3] = (byte) (res & 0xFF); // 最低位
targets[2] = (byte) ((res >> 8) & 0xFF); // 次低位
targets[1] = (byte) ((res >> 16) & 0xFF); // 次高位
targets[0] = (byte) (res >>> 24); // 最高位,無符號右移
return targets;
}
/** byte[4] 轉 int (大端序) */
public static int byteArrayToInt(byte[] b) {
byte[] a = new byte[4];
int i = a.length - 1, j = b.length - 1;
for (; i >= 0; i--, j--) { // 從 b 尾部(低位)開始複製
a[i] = (j >= 0) ? b[j] : 0; // 不足 4 位高位補 0
}
int v0 = (a[0] & 0xFF) << 24;
int v1 = (a[1] & 0xFF) << 16;
int v2 = (a[2] & 0xFF) << 8;
int v3 = (a[3] & 0xFF);
return v0 + v1 + v2 + v3;
}
/** long 轉 byte[8] (大端序) */
public static byte[] long2byte(long res) {
byte[] buffer = new byte[8];
for (int i = 0; i < 8; i++) {
int offset = 64 - (i + 1) * 8;
buffer[i] = (byte) ((res >> offset) & 0xFF);
}
return buffer;
}
/** byte[8] 轉 long (大端序) */
public static long byteArrayToLong(byte[] b) {
long values = 0;
for (int i = 0; i < 8; i++) {
values <<= 8;
values |= (b[i] & 0xFF);
}
return values;
}
}
byte 在 Java 中為有符號(-128~127),透過 & 0xFF 轉為 0~255 無符號值,防止左移時符號位污染高位byteArrayToInt 處理長度不足 4 的陣列,高位自動補 0掌握位運算轉換技巧,是處理高效能二進位資料的基礎功力。