【问题标题】:NSInteger to byte array in reverse orderNSInteger 以相反的顺序转换为字节数组
【发布时间】:2012-07-16 21:56:19
【问题描述】:

在过去的几个小时里,我一直在努力完成一项似乎很容易的任务。

我的应用正在通过 tcpip 与服务器通信。该协议要求每个请求的前 4 个字节是流的长度,顺序相反。例如,如果长度为 13,我需要提供(十进制){0,0,0,13};如果是 300,我需要提供 {0,0,44,256}。然后,实际数据如下。

显然,这在 Java 和 VB 中都非常简单(例如 BitConverter.GetBytes(sendString.Length).Reverse().ToArray())。但是在 obj-c 中我就是无法让它工作,我尝试了 NSString/NSData/NSArray 之间的各种转换,但没有成功。

提前致谢!

【问题讨论】:

  • 嗯? {0,0,44,256} 不是有效的字节序列(因为 256 不是有效的字节值)。你只是按网络顺序(又名大端)写一个整数吗?
  • @Adam 是的,看起来 300 应该写成{0,0,1,44},对吗?除非我错过了什么。再说一次,这个问题似乎指定使用一些奇怪的字节顺序,所以可能是 {44,1,0,0}{0,0,44,1}?
  • @AdamRosenfield 我确定 OP 表示该字节为 0x01,但由于其位置,它代表 256。 (256*1)+44=300。
  • @Adam 是的,很抱歉,这是漫长的一天的结束,我对此感到非常沮丧(好吧,事实证明,我自己的缺点)。实际上,后一种情况下的正确表示是 {0,0,1,44}。感谢其他所有人指出这一点,而不是因为一个非常菜鸟的错误而扇我一巴掌:)

标签: objective-c bytearray


【解决方案1】:

服务器以大端顺序(最高有效字节在前)请求数据。 Big-endian 是 Internet 协议(包括 IP、TCP、UDP、DNS 等)的标准网络字节顺序。碰巧您正在为 little-endian 平台进行编译,因此您需要交换字节。

然而,您不应该依赖在小端平台上。相反,您应该使用Core Foundation byte-swapping functions 使您的代码独立 与本地(主机)字节顺序无关。

具体来说,您应该使用 CFSwapInt32HostToBig 将您的 4 字节 int 转换为 big-endian 顺序。在 little-endian 平台上,这会重新排列字节。在大端平台上,这没有任何作用。

同样,您应该使用CFSwapInt32BigToHost 将您从服务器收到的 4 字节整数转换为您的主机字节顺序。

或者,您可以使用standard POSIX byte-swapping functionshtonl 函数代表 host-to-network-long,将 32 位 int 从主机顺序转换为网络(大端)顺序。 ntohl 函数将 32 位 int 从网络顺序转换为主机顺序。 (在创建这些函数的时候,一些流行的操作系统有 16 位整数和 32 位长整数。你相信吗?)

【讨论】:

  • 谢谢罗伯。昨晚我正要写,即使我之前看过this,我很确定这不是字节顺序的情况,因为我的crc有4个字节(而且我没有意识到Int32就是这样) .我想我正在做的是采用工程方法(将 int 转换为字节数组,交换字节,将结果转换为 nsdata)......并且错过了非常明显的,我现在觉得很愚蠢:) 短篇小说: 再次感谢,吸取教训。
【解决方案2】:
NSInteger a = 300; //13;
char* aa = &a;
Byte b[] = {0,0,0,0};
memcpy(&b[0], &aa[3], 1);
memcpy(&b[1], &aa[2], 1);
memcpy(&b[2], &aa[1], 1);
memcpy(&b[3], &aa[0], 1);

【讨论】:

  • 感谢 Jaspreet,这就是上面提到的工程方法 :)
【解决方案3】:

如重复问题的已接受答案所示,Foundation 提供了字节交换功能。在这种情况下,由于您处理的是 long,您可能需要NSSwapLong

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多