来自字节数组的NSSwapInt

时间:2012-01-24 17:29:45

标签: objective-c macos

我正在尝试实现一个函数,该函数将从一个字节数组(我的代码中是一个char *)读取一个存储有不同字节序的32位int。我被建议使用NSSwapInt,但我对如何去做它一无所知。有人能给我看一个片段吗?

提前致谢!

2 个答案:

答案 0 :(得分:7)

这是一个简短的例子:

unsigned char bytes[] = { 0x00, 0x00, 0x01, 0x02 };
int intData = *((int *)bytes);
int reverseData = NSSwapInt(intData);

NSLog(@"integer:%d", intData); 
NSLog(@"bytes:%08x", intData); 
NSLog(@"reverse integer: %d", reverseData);
NSLog(@"reverse bytes: %08x", reverseData);

输出将是:

integer:33619968
bytes:02010000
reverse integer: 258
reverse bytes: 00000102

docs中所述,

  

交换iv的字节并返回结果值。字节从每个低阶位置交换到相应的高阶位置,反之亦然。例如,如果inv的字节编号从1到4,则此函数交换字节1和4以及字节2和3。

还有一个NSSwapShort和NSSwapLongLong。

答案 1 :(得分:1)

如果通过使用整数指针解决此问题,则存在数据错位异常的潜在 - 例如某些体系结构要求32位值位于2或4字节的倍数的地址。 iPhone等人使用的ARM架构。在这种情况下可能会抛出异常,但我没有便于测试iOS设备是否存在。

一种安全的方法,它永远不会抛出任何错位异常是直接汇总整数:

int32_t bytes2int(unsigned char *b)
{
   int32_t i;

   i = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;  // little-endian, or
   i = b[3] | b[2] << 8 | b[1] << 16 | b[0] << 24;  // big-endian (pick one)

   return i;
}

你可以传递任何字节指针,它将组装4个字节以产生32位int。如果需要,您可以将想法扩展到64位整数。