【问题标题】:How can I reverse the byte order of an NSInteger or NSUInteger in objective-c如何在objective-c中反转NSInteger或NSUInteger的字节顺序
【发布时间】:2011-04-19 08:30:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: objective-c bytearray byte endianness nsinteger


    【解决方案1】:

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

    如果您知道自己拥有哪种格式,还有其他函数可以将其转换为原生字节序:NSSwapLittleIntToHostNSSwapBigIntToHost。还有一些反向函数可以从原生格式转换为小端或大端格式:NSSwapHostIntToLittleNSSwapHostIntToBig。这些也可用于其他整数类型和浮点类型。他们所做的是在必要时调用值的原始交换函数。所以NSSwapLittleIntToHost 什么都不做,而NSSwapBigIntToHost 在小端机器上返回NSSwapInt 的结果。

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

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

    【讨论】:

    • 谢谢,我环顾四周并没有找到 NSSwapBigIntToHost。我最终像你建议的那样做了一些低位操作。我假设我的整数在我的代码中将是 32 位的。我最终做的是创建一个 unsigned char tref = (unsigned char)&temp;然后我循环并交换字节,然后将tref转换为整数。不漂亮,但只要我是 32 位就可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多