簡體   English   中英

通過套接字從Objective-C向Java發送一個int,但是在Java端更改了該值

[英]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

您會看到字節順序(又稱字節順序)是相反的。

通常,如果通過套接字發送數據,則使用功能htonlhtons等將本地字節順序轉換為網絡字節順序。在接收端,您將網絡字節順序轉換回本地字節順序。 在Java中,您可以通過使用ByteBuffer#order(ByteOrder)設置緩沖區上的字節順序來做到這一點

另請參閱此問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM