6

这是对该帖子的后续跟进,但有一个不同的问题,所以我觉得我应该在单独的线程中提问。

我正处于从文件中读取的内存中有四个连续字节的地步。我想将它们存储为一个位数组(它们的实际 int 值直到以后才重要)。当我打印出 int 中的内容时,我注意到它似乎以相反的顺序存储(小端序)。

有没有人有一个很好的方法来反转字节的顺序。然后一旦反转,挑选出跨越两个字节的连续位并转换回整数?

unsigned char data[] = { 0x00, 0x02, 0x45, 0x28 };
NSInteger intData = *((NSInteger *)data);

NSLog(@"data:%08x", intData); // data:28450200
4

1 回答 1

16

Cocoa(或者确切地说是 Foundation 框架)具有交换字节字节序的功能:NSSwapIntNSSwapShortNSSwapLongNSSwapLongLong. 无论如何,这些交换字节 - 它们从小端整数生成大端整数,反之亦然。

如果您知道您拥有哪种格式,那么还有其他功能可以将其交换为本机字节顺序:NSSwapLittleIntToHostNSSwapBigIntToHost. 还有一些反向函数可以从本机格式转换为小端或大端格式:NSSwapHostIntToLittleNSSwapHostIntToBig. 这些也可用于其他整数类型和浮点类型。他们所做的是在必要时调用值的原始交换函数。所以在小端机器上返回结果时NSSwapLittleIntToHost不做任何事情。NSSwapBigIntToHostNSSwapInt

请注意,这些参数采用编译器整数类型而不是NSInteger类型。因此,根据您是生成 32 位还是 64 位代码,如果您使用NSInteger.

您也不应该将字节数组转换为整数指针并取消引用它。使用位移操作组装整数会更好。您的代码只有在NSInteger32 位宽时才有效。如果它是 64 位,那么您的号码将是垃圾,或者您的程序甚至可能崩溃。但是,即使您使用的是始终为 32 位宽的整数类型(例如int32_t来自 C99<stdint.h>标头),这也可能无法按预期工作。

于 2010-09-30T13:41:34.607 回答