2

我无法将位置坐标传送到我在网络上连接的一组电机。我可以很好地发送一个字符串,并从电机接收文本,但我似乎无法向它发送一个 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]];
4

2 回答 2

8

好吧,你的代码看起来很有趣。无论如何,要通过网络发送二进制整数,您必须知道字节序:接收方需要小字节序整数或大字节序整数。

这是两者的代码:

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)];
于 2010-07-13T16:43:15.557 回答
1

您可能会看到字节顺序问题。Intel CPU 是little-endian,这意味着多字节值中的最低有效字节首先存储,最高有效字节最后存储。从内存中读取一个 8 字节的数字并将其放到网络上而不做任何事情将导致字节按该顺序输出。

大多数网络协议(包括所有互联网协议)都需要大端数据,因此最高有效字节首先出现在网络上,最低有效字节最后出现。您的网络协议是否期望这一点?

于 2010-07-13T16:42:37.570 回答