我正面临一些问题,试图通过插座与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),我避免了长期类型,因为在
上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();
请注意,尽管将字节施放到字节上"失去"高8位,所以这仅适用于ASCII Chars。