Java .Net Byte数组存储差异以及解决方法
最近在Java與.Net服務(wù)Bytes數(shù)據(jù)交互碰到一個(gè)問(wèn)題:.Net IntToBytes結(jié)果和Java IntToBytes結(jié)果是反序的,查了一下發(fā)現(xiàn):Java stores things internally as Big Endian, while .NET is Little Endian by default.
Big Endian:最高字節(jié)在地址最低位,最低字節(jié)在地址最高位,依次排列。
Little Endian:最低字節(jié)在最低位,最高字節(jié)在最高位,反序排列。
? ? ? 為什么要注意字節(jié)序的問(wèn)題呢?你可能這么問(wèn)。當(dāng)然,如果你寫(xiě)的程序只在單機(jī)環(huán)境下面運(yùn)行,并且不和別人的程序打交道,那么你完全可以忽略字節(jié)序的存在。但是,如果你的程序要跟別人的程序產(chǎn)生交互呢?在這里我想說(shuō)說(shuō)兩種語(yǔ)言。C/C++語(yǔ)言編寫(xiě)的程序里數(shù)據(jù)存儲(chǔ)順序是跟編譯平臺(tái)所在的CPU相關(guān)的,而JAVA編寫(xiě)的程序則唯一采用big endian方式來(lái)存儲(chǔ)數(shù)據(jù)。試想,如果你用C/C++語(yǔ)言在x86平臺(tái)下編寫(xiě)的程序跟別人的JAVA程序互通時(shí)會(huì)產(chǎn)生什么結(jié)果?就拿上面的0x12345678來(lái)說(shuō),你的程序傳遞給別人的一個(gè)數(shù)據(jù),將指向0x12345678的指針傳給了JAVA程序,由于JAVA采取big endian方式存儲(chǔ)數(shù)據(jù),很自然的它會(huì)將你的數(shù)據(jù)翻譯為0x78563412。什么?竟然變成另外一個(gè)數(shù)字了?是的,就是這種后果。因此,在你的C程序傳給JAVA程序之前有必要進(jìn)行字節(jié)序的轉(zhuǎn)換工作。
?
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解決方法:
System.BitConverter.GetBytes(value).Reverse().ToArray();?
轉(zhuǎn)載于:https://www.cnblogs.com/CopyPaster/p/5757309.html
總結(jié)
以上是生活随笔為你收集整理的Java .Net Byte数组存储差异以及解决方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ 系列:基础知识储备
- 下一篇: ASP.NET Core中如影随形的”依