Java .Net Byte數組存儲差別以及解決方法

最近在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();
相關文章
相關標籤/搜索