最近在Java與.Net服務Bytes數據交互碰到一個問題:.Net IntToBytes結果和Java IntToBytes結果是反序的,查了一下發現:Java stores things internally as Big Endian, while .NET is Little Endian by default.spa
Big Endian:最高字節在地址最低位,最低字節在地址最高位,依次排列。
Little Endian:最低字節在最低位,最高字節在最高位,反序排列。
爲何要注意字節序的問題呢?你可能這麼問。固然,若是你寫的程序只在單機環境下面運行,而且不和別人的程序打交道,那麼你徹底能夠忽略字節序的存在。可是,若是你的程序要跟別人的程序產生交互呢?在這裏我想說說兩種語言。C/C++語言編寫的程序裏數據存儲順序是跟編譯平臺所在的CPU相關的,而JAVA編寫的程序則惟一採用big endian方式來存儲數據。試想,若是你用C/C++語言在x86平臺下編寫的程序跟別人的JAVA程序互通時會產生什麼結果?就拿上面的0x12345678來講,你的程序傳遞給別人的一個數據,將指向0x12345678的指針傳給了JAVA程序,因爲JAVA採起big endian方式存儲數據,很天然的它會將你的數據翻譯爲0x78563412。什麼?居然變成另一個數字了?是的,就是這種後果。所以,在你的C程序傳給JAVA程序以前有必要進行字節序的轉換工做。翻譯
Java解決方法:指針
1 int intValue = 12345; 2 byte[] bytes1 = ByteUtils.intToBytes(intValue); //[0, 0, 48, 57] 3 4 ByteBuffer byteBuffer = ByteBuffer.allocate(4); 5 byteBuffer.order(ByteOrder.LITTLE_ENDIAN); 6 byteBuffer.putInt(intValue); 7 byte[] bytes2 = byteBuffer.array(); //[57, 48, 0, 0]
.NET解決方法:code
System.BitConverter.GetBytes(value).Reverse().ToArray();