我遇到了通信位置坐标的一组电机,我已经连接在网络上。我可以发出一个绳子,然后从电机接收文本,但我似乎无法将其发送一个int值。

使用nslog我已经确定了我发送的实际值是正确的,但是我怀疑我通过输出流发送它的方法是错误的。有任何想法吗?

发送64位int值的代码:

uint64_t rawInt = m1; 
rawInt <<= 16; 
rawInt |= m2;
NSData *buffer = [NSData dataWithBytes: &rawInt length:8];
[outputStream write: [buffer bytes] maxLength:[buffer length]];
.

有帮助吗?

解决方案

好吧,你的代码看起来有趣。无论如何,对于通过网络发送二进制整数,您必须知道exidianess:接收方要么期望很少或大的内部整数。

这是两者的代码:

uint64_t myInt = 42;

uint64_t netInt = CFSwapInt64HostToLittle(myInt); // use this for little endian
uint64_t netInt = CFSwapInt64HostToBig(myInt);    // use this for big endian

[outputStream write:(uint8_t*)&netInt maxLength:sizeof(netInt)];
.

其他提示

你可能会看到一个endianness问题。英特尔CPU是 Little-Endian ,这意味着首先存储多字节值中最低有效字节,最重要的字节。从内存中读取8字节的数字并将其放在网络上而无需执行任何操作,将导致字节以此顺序出发。

大多数网络协议(包括所有互联网协议)期望 big-endian 数据,因此最重要的字节出现在网络上,最重要的字节。您的网络协议是否期望?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top