Sco*_*ott 6 byte bytearray objective-c endianness nsinteger
这是对这个帖子的一些跟进,但是有一个不同的问题,所以我觉得我应该在另一个帖子中提问.
我在内存中有四个连续字节,我从一个文件读入.我想将它们存储为一个位数组(它们的实际int值直到后来都无关紧要).当我打印出我的int中的内容时,我注意到它似乎以相反的顺序存储(小端).
有没有人有一个很好的方法来反转字节的顺序.然后反转,挑出跨越两个字节的连续位并转换回int?
unsigned char data[] = { 0x00, 0x02, 0x45, 0x28 };
NSInteger intData = *((NSInteger *)data);
NSLog(@"data:%08x", intData); // data:28450200
Run Code Online (Sandbox Code Playgroud)
Sve*_*ven 16
可可(或确切地说是基础框架)具有功能转换字节的字节序:NSSwapInt,NSSwapShort,NSSwapLong,和NSSwapLongLong.无论如何,这些都会在字节周围交换 - 它们从小端整数中产生大端整数,反之亦然.
如果你知道你有哪种格式,那么还有其他函数可以将它交换为本机字节序:NSSwapLittleIntToHost和NSSwapBigIntToHost.还有从原生格式转换为小端或大端格式的反向函数:NSSwapHostIntToLittle和NSSwapHostIntToBig.这些也可用于其他整数类型和浮点类型.他们所做的是在必要时调用值上的原始交换函数.因此NSSwapLittleIntToHost在NSSwapBigIntToHost返回NSSwapInt小端机器上的结果时不做任何事情.
请注意,这些参数包含编译器整数类型而不是NSInteger类型.因此,根据您生成的32位或64位代码,如果您使用的话,必须使用不同的功能NSInteger.
您也不应该将您的字节数组转换为整数指针并取消引用它.使用位移操作组装整数会更好.您的代码只有在NSInteger32位宽的情况下才能工作.如果它是64位,那么你的号码将是垃圾或你的程序甚至可能崩溃.但即使您使用的是一个总是32位宽的整数类型(例如int32_t来自C99 <stdint.h>标头),这可能无法正常工作.
| 归档时间: |
|
| 查看次数: |
3498 次 |
| 最近记录: |