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

时间:2014-01-25 15:15:51

标签: android ios sockets bytebuffer

我在试图通过套接字与UDP设备进行通信时遇到了一些问题(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上,这是我用来解析从socket

获取的数据的代码
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)之间的兼容性问题,我避免了长类型,因为在

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

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

编辑1:

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

1 个答案:

答案 0 :(得分:1)

在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();

注意,虽然将字符串转换为字节“丢失”高8位,但这只适用于ASCII字符。