将64位int值写入NSOutputStream

时间:2010-07-13 16:34:07

标签: iphone networking int nsoutputstream

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

2 个答案:

答案 0 :(得分:7)

嗯,你的代码看起来很有趣。无论如何,为了通过网络发送二进制整数,你必须知道结束:接收者要求小端或大端整数。

以下是两者的代码:

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)];

答案 1 :(得分:1)

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

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