2

在过去的几个小时里,我一直在敲打我的头,这似乎是一项非常容易的任务。

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

提前致谢!

4

3 回答 3

6

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

但是,您不应该依赖于小端平台。相反,您应该使用Core Foundation 字节交换函数使您的代码独立于本地(主机)字节顺序。

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

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

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

于 2012-07-16T22:10:05.923 回答
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);
于 2012-07-17T01:04:17.523 回答
0

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

于 2012-07-16T22:03:49.107 回答