将 64 位 int 值写入 NSOutputStream

Posted

技术标签:

【中文标题】将 64 位 int 值写入 NSOutputStream【英文标题】:Writing 64 bit int value to NSOutputStream 【发布时间】:2010-07-13 16:34:06 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

这是两者的代码:

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

【讨论】:

上面的代码给出了警告:“警告:从不兼容的指针类型传递 'write:maxLength:' 的参数 1”。 尽管有警告,代码仍然有效。我的字节序与它应该的相反。谢谢! 添加演员表以删除警告。【参考方案2】:

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

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

【讨论】:

以上是关于将 64 位 int 值写入 NSOutputStream的主要内容,如果未能解决你的问题,请参考以下文章

无法将字符串解组为 int64 类型的 Go 值

将 Int64 转换为 UUID

int64的读写操作是否具有原子性质

int 是 64 位 C# 中的 64 位整数吗?

Go map[int64]int64 写入 redis 占用多少内存

将多个值打包到一个原子中的标准化方法