我有一段代码
NSMutableData *mData = [NSMutableData data];
uint16_t bytes = 0x9F21;
[mData appendBytes:&bytes length:sizeof(bytes)];当我用p/x打印字节时,我得到
0x9F21如果我想要po mData,我会得到
<219f>这是一个与字节排序相关的问题,我看到如果转换字节的顺序,mData将正确地存储字节。
如果我用以下代码打印mData对象,就会得到预期的值。
NSMutableData *mData = [NSMutableData data];
uint16_t bytes = CFSwapInt16HostToBig(0x9F21);
[mData appendBytes:&bytes length:sizeof(bytes)];这就意味着appendBytes需要对小的和大的端点架构进行大端点排序?
发布于 2013-11-25 10:40:23
appendBytes将按照它们在提供给方法的缓冲区指针中的顺序获取字节。它既不要求也不假定任何特定的子项顺序。
您必须根据NSData中所需的字节顺序转换您的int "endianness“。如果您只对字节感兴趣并直接存储字节,则不要使用int_16。如果不知道要存储的数据,就很难给出更多的建议。
发布于 2013-11-25 10:40:24
您不需要说明要对数据做什么,但是,您只应该在从/写入外部媒体(如定义了数据的端点的网络连接和文件)时才将endian转换为endian。这个过程称为编组。
所有的数据都在您的应用程序中,并且需要进行操作,您需要将数据保持在它的本机形式中,这实际上被视为大端(例如,做一些类似bytes >> 8的操作将产生0x9f)。
当我用p/x打印字节时,我得到
0x9F21,即以本机格式打印16位无符号整数(LLDB知道它是16位类型)。
如果我想要po mData,我会得到
<219f>这是打印一个字节流,因为这是NSData对象的性质。它揭示了您的本地体系结构是小的-endian,但是这并不重要。
https://stackoverflow.com/questions/20189830
复制相似问题