我在 NSData 中发送一个 int,如下所示:
NSData* dataLength = [[NSData alloc] initWithBytes:&theInt length:sizeof(theInt)];
然后在java端,我得到一个像这样的int:
int theInt = aInputStreamOfSocket.readInt();
但是值改变了!就我而言,我发送 1225516 并收到 749933056 有什么问题吗?
最佳答案
你的麻烦是endianness中的差异。基于 Intel 的处理器使用小端字节顺序,而基于网络的传输几乎总是大端字节顺序。因此,Java 希望 readInt()
采用大尾数法。理想情况下,您找到一种方法将 int 作为大尾数发送以符合预期的行为。然而,我没有现成的代码,因此以下是如何在 Java 端读取小端字节序:
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);
关于java - 通过socket从objective-c发送一个int到java,但是java端的值改变了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5712066/