java - 通过socket从objective-c发送一个int到java,但是java端的值改变了

标签 java objective-c int

我在 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/

相关文章:

c++ - 如何用 C++ 编写随机大写字符生成器?

Java:如何从字符串和整数计算答案

java - Spring /hibernate : InvocationTargetException when deleting entity

ios - Youtube API v3,视频播放时参数无效问题

objective-c - 如何从弱属性中移除 KVO?

c - 使用将超过其类型最大值的索引/计数器循环

java - 如何在 Java/Android 中构建数组、推送数组并循环遍历数组

java - 从 netbeans 运行应用程序和运行 jar 有什么区别?

java - 是否有任何特定于 DBMS 的 SQL 客户端 Java 库(不一定与 JDBC 相关或兼容)

objective-c - 风险评估 : Using Pthreads (vs. GCD 或 NSThread)