NSInteger以相反的顺序转换为字节数组

时间:2012-07-16 21:56:19

标签: objective-c bytearray

在过去的几个小时里,我一直在敲打我的脑袋,这似乎是一项非常简单的任务。

我的应用通过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之间的各种转换,但没有运气。

提前致谢!

3 个答案:

答案 0 :(得分:6)

服务器以big-endian顺序询问数据(最重要的字节优先)。 Big-endian是Internet协议的标准网络字节顺序(包括IP,TCP,UDP,DNS等等)。碰巧你正在编译一个小端平台,所以你需要交换字节。

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

具体来说,您应该使用CFSwapInt32HostToBig将您的4字节int转换为big-endian顺序。在小端平台上,这会重新排列字节。在大端平台上,这什么都不做。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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