luc*_*anf 2 bytearray objective-c
在过去的几个小时里,我一直在敲打我的脑袋,这似乎是一项非常简单的任务.
我的应用程序通过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之间的各种转换,没有运气.
提前致谢!
服务器要求以big-endian顺序(最重要的字节优先)的数据.Big-endian是Internet协议的标准网络字节顺序(包括IP,TCP,UDP,DNS等等).碰巧你正在编译一个小端平台,所以你需要交换字节.
但是,您不应该依赖于小端平台.相反,您应该使用Core Foundation字节交换功能使您的代码独立于本地(主机)字节顺序.
具体来说,您应该使用CFSwapInt32HostToBig将4字节int转换为big-endian顺序.在小端平台上,这会重新排列字节.在大端平台上,这没有任何作用.
同样,您应该使用CFSwapInt32BigToHost从服务器接收的4字节整数转换为主机字节顺序.
或者,您可以使用标准POSIX字节交换功能.该htonl函数代表host-to-network-long并将32位int从主机顺序转换为网络(big-endian)顺序.该ntohl函数将32位int从网络转换为主机顺序.(当创建这些函数时,一些流行的操作系统有16位整数和32位长整数.你能相信吗?)