在Objective C中,Get Big Endian函数会是什么样的?

时间:2016-07-20 06:41:07

标签: ios objective-c endianness

我刚刚浏览了一个Java代码,他们在给定长度的getBigEndian函数代码之一。以下是 JAVA

的代码
// JAVA
public static byte[] getBigEndian32(int length) {
    byte[] res = new byte[4];
    res[0] = (byte) (length >>> 24);
    res[1] = (byte) ((length >>> 16) & 0xFF);
    res[2] = (byte) ((length >>> 8) & 0xFF);
    res[3] = (byte) (length & 0xFF);
    return res;
}

目标C 中,此功能会是什么样的?我尝试了下面的解决方案,但没有给我上面函数返回的确切输出。

// Tried Solution 1:
NSMutableData *data = [NSMutableData data];
[data appendBytes:(const void *)(length >> 24) length:4];
[data appendBytes:(const void *)(length >> 16 & 0xFF) length:4];
[data appendBytes:(const void *)(length >> 8 & 0xFF) length:4];
[data appendBytes:(const void *)(length & 0xFF) length:4];

上面的代码在第二行崩溃了。没有有用的日志:(

// Tried Solution 2:
int convert(int num)
{
    int b0,b1,b2,b3;
    b0= (num & 0x000000FF)>>0;
    b1= (num & 0x0000FF00)>>8;
    b2= (num & 0x00FF0000)>>16;
    b3= (num & 0xFF000000)>>24;

    num= (b0<<24) | (b1<<16) | (b2<<8) | (b3<<0) ;

    return num;
}

以上解决方案来自: Convert Little Endian to Big Endian

也经历了Bit conversion tool in Objective-C。这也没有帮助。

让我对如何将此Java代码转换为Objective C代码有任何暗示或想法。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您的代码未转换为Bigendian字节顺序。它交换字节。因此它会将Bigendian转换为LittleEndian,反之亦然,这意味着Bigendian处理器完全错误。

CFSwapInt32HostToBig正是您所需要的:将数字转换为BigEndian格式。无论你的处理器是什么。 htnl()以更便携的方式执行相同的操作,除了它意味着&#34;主机到网络字节顺序&#34;,并且网络字节顺序是Bigendian。然后,您可以将该数字添加到NSData。