圖00 Big-Endian(左)and little-endian(右)
大小端的基礎知識:
小端 ( little-endian):低位字節在前,高位字節在后。大端(Big-Endian),則反之。具體而言,就是為了說清楚,CPU架構中1字(word)的存儲順序。計算機內存中數據自然流動的順序就是:低位先來,高位緊隨其后
轉載請注明出處:https://www.cnblogs.com/NaughtyCat/p/little-endian-and-big-endian-based-on-bytebuffer-in-java.html
JAVA中所有的二進制文件都是按大端存儲,這種存儲方式也被稱為network order。即在所有的平台上,如Mac、 PC、 UNIX等等運行JAVA,都不用考慮大小端的問題。麻煩的是不同語言開發的程序進行數據交換,如筆者最近的項目,二進制文件是由C生成的,通過redis 消息通道以Json格式發過來,而C語言默認是小端模式,就涉及到大小端轉換。有些平台(如Mac、IBM 390)內置用的大端模式,其它一些平台內置用的小端模式 (如Intel)。JAVA幫你屏蔽了各平台字節順序的差異。開心呀
32位16進制的 0x45679812在內存中的存儲(大小端模式)如下圖(作者【CoderBaby】:
JAVA代碼實現:基於ByteBuffer(可通過Order來設置大端或者小端,默認為大端 — Big-Endian),代碼實現如下圖(支持網絡端口—2字節及4字節的int轉換;同時包括了網絡端口0 ~ 65535的解析):
/** * 將小端bytes數據轉化為大端數據 * <p> * 默認網絡傳輸字節為大端,java 全部為大端(與平台無關) * 關於 “Little-Endian and Big-Endian”,詳情請參考: * * @param bytes * @return 轉化后得到的整數 * @Link https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/ * </p> */ private int bytesToBigEndian(byte[] bytes) { int result = 0; if (bytes == null || bytes.length < 0) return -1; ByteBuffer buffer = ByteBuffer.wrap(bytes); buffer.order(ByteOrder.BIG_ENDIAN); if (bytes.length == RECORD_BYTES_SIZE) { result = buffer.getInt(); } else if (bytes.length == PORT_BYTES_SIZE) { // 端口號:0 ~ 65535; Short: -32768 ~ 32767 short tmp = buffer.getShort(); result = tmp < 0 ? getUnsignedShort(tmp) : tmp; } if (result < 0) { logger.info("Length = " + result + " ; original data:" + bytes); } return result; }
附:
1)大小端說明 https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/
*****************************************************************************************************
精力有限,想法太多,專注做好一件事就行
- 我只是一個程序猿。5年內把代碼寫好,技術博客字字推敲,堅持零拷貝和原創
- 寫博客的意義在於打磨文筆,訓練邏輯條理性,加深對知識的系統性理解;如果恰好又對別人有點幫助,那真是一件令人開心的事
*****************************************************************************************************