計算機內存中的數據存儲方式有大端和小端兩種,它們的區別在于字節的存儲順序不同。Java提供了一些方法可以實現大端和小端之間的轉換。
大端存儲是指將高位字節存儲在內存的低地址處,低位字節存儲在內存的高地址處。例如,16進制數據0x12345678在大端存儲中就是以0x12、0x34、0x56、0x78的順序存儲的。
小端存儲則是將低位字節存儲在內存的低地址處,高位字節存儲在內存的高地址處。在小端存儲中,同樣的數據0x12345678就是以0x78、0x56、0x34、0x12的順序存儲的。
/** * 方法一:使用位運算進行轉換 */ public static int bigEndian2Int(byte[] bytes) { int result = 0; for (int i = 0; i< bytes.length; i++) { result += (bytes[i] & 0xFF)<< (8 * (bytes.length - i - 1)); } return result; } public static byte[] int2BigEndian(int value, int length) { byte[] result = new byte[length]; for (int i = 0; i< length; i++) { result[i] = (byte) ((value >>(8 * (length - i - 1))) & 0xFF); } return result; } /** * 方法二:使用Java自帶的方法進行轉換 */ public static int bigEndian2Int(byte[] bytes) { return ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt(); } public static byte[] int2BigEndian(int value, int length) { ByteBuffer buffer = ByteBuffer.allocate(length); buffer.order(ByteOrder.BIG_ENDIAN).putInt(value); return buffer.array(); }
上述代碼演示了兩種方法實現大端到整型的轉換,在第一種方法中,我們使用位運算獲取每個字節并按照對應的順序組合起來,第二種方法則通過Java自帶的ByteOrder和ByteBuffer類實現轉換。
/** * 方法一:使用位運算進行轉換 */ public static int littleEndian2Int(byte[] bytes) { int result = 0; for (int i = 0; i< bytes.length; i++) { result += (bytes[i] & 0xFF)<< (8 * i); } return result; } public static byte[] int2LittleEndian(int value, int length) { byte[] result = new byte[length]; for (int i = 0; i< length; i++) { result[i] = (byte) ((value >>(8 * i)) & 0xFF); } return result; } /** * 方法二:使用Java自帶的方法進行轉換 */ public static int littleEndian2Int(byte[] bytes) { return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt(); } public static byte[] int2LittleEndian(int value, int length) { ByteBuffer buffer = ByteBuffer.allocate(length); buffer.order(ByteOrder.LITTLE_ENDIAN).putInt(value); return buffer.array(); }
以上代碼演示了兩種方法實現小端到整型的轉換,與大端不同的是,小端轉換時需要將每個字節按照相反的順序組合起來。同樣地,在第一種方法中,我們使用位運算獲取每個字節并按照對應的順序組合起來,第二種方法則通過Java自帶的ByteOrder和ByteBuffer類實現轉換。
上一篇ios和java哪個難
下一篇vue引入mint ui