Java 大小端轉換(基於ByteBuffer)


        圖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年內把代碼寫好,技術博客字字推敲,堅持零拷貝和原創
  • 寫博客的意義在於打磨文筆,訓練邏輯條理性,加深對知識的系統性理解;如果恰好又對別人有點幫助,那真是一件令人開心的事

*****************************************************************************************************


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM