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

Objective c NSInteger以相反顺序转换为字节数组,objective-c,bytearray,Objective C,Bytearray,在过去的几个小时里,我一直在绞尽脑汁做一件看起来很简单的事情 我的应用程序正在通过tcpip与服务器通信。协议要求每个请求的前4个字节是流的长度,顺序相反。例如,如果长度为13,我需要提供(十进制){0,0,0,13};如果是300,我需要提供{0,0,44256}。然后,实际数据如下 显然,这在Java和VB中都非常简单(例如BitConverter.GetBytes(sendString.Length).Reverse().ToArray())。但在obj-c中,我就是无法让它工作,我尝试了

在过去的几个小时里,我一直在绞尽脑汁做一件看起来很简单的事情

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

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


提前谢谢

>P>在重复问题的公认答案中,Foundation提供了字节交换的功能。在这种情况下,由于您处理的是长数据,您可能需要
NSSwapLong

服务器以大端顺序请求数据(首先是最重要的字节)。Big-endian是Internet协议(包括IP、TCP、UDP、DNS等)的标准网络字节顺序。碰巧您正在编译一个小型的endian平台,因此需要交换字节

然而你不应该依赖于一个小小的endian平台。相反,您应该使代码独立于本地(主机)字节顺序,使用

具体来说,您应该使用
CFSwapInt32HostToBig
将4字节的int转换为big-endian顺序。在一个小小的endian平台上,这会重新排列字节。在big-endian平台上,这不起任何作用

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


或者,您可以使用。
htonl
函数表示主机到网络的长度
并将32位整数从主机顺序转换为网络(大端)顺序。
ntohl
函数将32位整数从网络顺序转换为主机顺序。(当这些函数创建时,一些流行的操作系统有16位整数和32位长整数。你相信吗?

?{0,0,44256}不是有效的字节序列(因为256不是有效的字节值)。你只是在写一个网络顺序的整数(也就是big-endian)?可能是@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}。感谢大家指出这一点,并没有因为我犯了一个新手错误而扇我耳光:)谢谢罗布。昨晚我正要写,尽管我以前看到过,但我很确定这不是endianness的情况,因为我的crc有4个字节(我没有意识到Int32就是这样)。我想我所做的是采用工程方法(将int转换为字节数组,交换字节,将结果转换为nsdata)。。。错过了非常明显的,我现在觉得很愚蠢的:)短篇故事:再次感谢,吸取了教训。感谢Jaspreet,这就是上面提到的工程方法:)
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);