android - Android 和 iOS 之间的套接字数据问题

标签 android ios sockets bytebuffer

我在尝试通过套接字与 2 个设备通信时遇到了一些问题(UDP,但不是这里的问题...) 一个设备是 Android,另一个是 iOS。

这是用于创建我要发送的数据的 Android 代码:

int part = 1;
int num = -1;

ByteBuffer bb = ByteBuffer.allocate(20);
bb.order(ByteOrder.nativeOrder());
bb.putChar('R');
bb.putInt(part);
bb.putInt(num);
bb.flip();

byte[] toSend = new byte[bb.remaining()]; // bb.remaining() = 10
bb.get(toSend);

send(toSend);

在 iOS 上,这是我用来解析从套接字获取的数据的代码

char *sData = (char*)[data bytes];
if (sData[0] == 'R') {
        sData += sizeof(char);
        int part = 0;
        memcpy(&part, sData, sizeof(int));
        sData += sizeof(int);
        int num = 0;
        memcpy(&num, sData, sizeof(int));
}

我得到的数据是:

part = 256
num = -256

奇怪的是,如果我改变我得到的 Android 设备的值:

part = 0 & num = -1 ---> part = 0 & num = -256
part = 1 & num = -1 ---> part = 256 & num = -256
part = 2 & num = -1 ---> part = 512 & num = -256
part = 3 & num = -1 ---> part = 768 & num = -256

如您所见,该值是正确的,它们只是乘以 256,我不明白为什么...

为了避免 Android 和 iOS (32/64) 之间的兼容性问题,我避免了 long 类型,因为在

Android long = 8
iOS 32b long = 4
iOS 64b long = 8

有人能看出为什么我的值乘以 256 吗?

编辑 1:

从 iOS 到 iOS 的数据传输,它工作正常,所以我猜测这个错误来自 Android。

最佳答案

在 Java 中,您的缓冲区包含以下内容:

char 2 bytes | int 4 bytes | int 4 bytes

由于 iOS 将 char 存储在一个字节中,因此您正在读取它,就好像它是:

char 1 byte | int 4 bytes | int 4 bytes

这也解释了为什么 iOS -> iOS 可以工作。

[编辑]

要修复,您可以在 Java 中使用 byte

byte b = (byte) 'R';

像这样:

ByteBuffer bb = ByteBuffer.allocate(20);
bb.order(ByteOrder.nativeOrder());
bb.putByte((byte)'R');
bb.putInt(part);
bb.putInt(num);
bb.flip();

请注意,尽管将 char 转换为 byte 会“丢失”高 8 位,因此这仅适用于 ASCII 字符。

关于android - Android 和 iOS 之间的套接字数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352302/

相关文章:

javascript - 固定位置在移动浏览器中不起作用

Android studio - 构建脚本错误,发现不支持的 Gradle DSL 方法 : 'android()' !

android - 如何从调用的 Activity 返回当前日期和时间?

c# - 使用两个相似的 Collection View 单元格,从而避免代码重复

Android CoordinatorLayout,Scrolling Activity 模板所有布局都飞走了

ios - EAGLContext PresentRenderbuffer 导致死锁

javascript - 在没有 jQuery 的情况下防止双击缩放

c++ - UDP 套接字错误 10049

Java Sockets - 服务器在客户端发送响应后挂起

linux - Linux 上奇怪的 AF_INET 和 SOCK_STREAM 套接字行为