圖00 Big-Endian(左)and little-endian(右)html
大小端的基礎知識:java
小端 ( little-endian):低位字節在前,高位字節在後。大端(Big-Endian),則反之。具體而言,就是爲了說清楚,CPU架構中1字(word)的存儲順序。計算機內存中數據天然流動的順序就是:低位先來,高位緊隨其後redis
轉載請註明出處: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】:url
JAVA代碼實現:基於ByteBuffer(可經過Order來設置大端或者小端,默認爲大端 — Big-Endian),代碼實現以下圖(支持網絡端口—2字節及4字節的int轉換;同時包括了網絡端口0 ~ 65535的解析):spa
/** * 將小端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; }
附:.net
1)大小端說明 https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/code
*****************************************************************************************************htm
精力有限,想法太多,專一作好一件事就行
- 我只是一個程序猿。5年內把代碼寫好,技術博客字字推敲,堅持零拷貝和原創
- 寫博客的意義在於打磨文筆,訓練邏輯條理性,加深對知識的系統性理解;若是剛好又對別人有點幫助,那真是一件使人開心的事
*****************************************************************************************************
原文出處:https://www.cnblogs.com/NaughtyCat/p/little-endian-and-big-endian-based-on-bytebuffer-in-java.html