[英]send a int from objective-c to java by socket,but the value changed in java side
我像這樣在NSData中發送一個int:
NSData* dataLength = [[NSData alloc] initWithBytes:&theInt length:sizeof(theInt)];
然后在Java端,我得到一個這樣的int:
int theInt = aInputStreamOfSocket.readInt();
但是價值改變了! 就我而言,我發送1225516並獲得749933056是什么問題?
您的麻煩在於字節順序的不同。 基於Intel的處理器使用低位字節序,而基於網絡的傳輸幾乎總是高位字節序。 因此,Java希望readInt()
的字節序為big-endian。 理想情況下,您找到一種方法將int作為big-endian發送,以符合預期的行為。 但是,我沒有多余的代碼,因此這是在Java端讀取little-endian的方法:
int ch1 = aInputStreamOfSocket.read();
int ch2 = aInputStreamOfSocket.read();
int ch3 = aInputStreamOfSocket.read();
int ch4 = aInputStreamOfSocket.read();
if ((ch1 | ch2 | ch3 | ch4) < 0) {
throw new EOFException();
}
int theInt = ch1 + (ch2 << 8) + (ch3 << 16) + (ch4 << 24);
讓我們看看這兩個數字的十六進制
1225516 = 0x0012B32C 749933056 = 0x2CB31200
您會看到字節順序(又稱字節順序)是相反的。
通常,如果通過套接字發送數據,則使用功能htonl
, htons
等將本地字節順序轉換為網絡字節順序。在接收端,您將網絡字節順序轉換回本地字節順序。 在Java中,您可以通過使用ByteBuffer#order(ByteOrder)設置緩沖區上的字節順序來做到這一點
另請參閱此問題 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.