我正在尝试实现一个函数,该函数将从一个字节数组(我的代码中是一个char *)读取一个存储有不同字节序的32位int。我被建议使用NSSwapInt,但我对如何去做它一无所知。有人能给我看一个片段吗?
提前致谢!
答案 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位整数。