首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSArray与endianness

NSArray与endianness
EN

Stack Overflow用户
提问于 2013-11-25 10:31:06
回答 2查看 228关注 0票数 1

我有一段代码

代码语言:javascript
复制
NSMutableData *mData = [NSMutableData data];

uint16_t bytes = 0x9F21;
[mData appendBytes:&bytes length:sizeof(bytes)];

当我用p/x打印字节时,我得到

代码语言:javascript
复制
0x9F21

如果我想要po mData,我会得到

代码语言:javascript
复制
<219f>

这是一个与字节排序相关的问题,我看到如果转换字节的顺序,mData将正确地存储字节。

如果我用以下代码打印mData对象,就会得到预期的值。

代码语言:javascript
复制
NSMutableData *mData = [NSMutableData data];

uint16_t bytes = CFSwapInt16HostToBig(0x9F21);
[mData appendBytes:&bytes length:sizeof(bytes)];

这就意味着appendBytes需要对小的和大的端点架构进行大端点排序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-25 10:40:23

appendBytes将按照它们在提供给方法的缓冲区指针中的顺序获取字节。它既不要求也不假定任何特定的子项顺序。

您必须根据NSData中所需的字节顺序转换您的int "endianness“。如果您只对字节感兴趣并直接存储字节,则不要使用int_16。如果不知道要存储的数据,就很难给出更多的建议。

票数 0
EN

Stack Overflow用户

发布于 2013-11-25 10:40:24

您不需要说明要对数据做什么,但是,您只应该在从/写入外部媒体(如定义了数据的端点的网络连接和文件)时才将endian转换为endian。这个过程称为编组

所有的数据都在您的应用程序中,并且需要进行操作,您需要将数据保持在它的本机形式中,这实际上被视为大端(例如,做一些类似bytes >> 8的操作将产生0x9f)。

当我用p/x打印字节时,我得到

代码语言:javascript
复制
0x9F21

,即以本机格式打印16位无符号整数(LLDB知道它是16位类型)。

如果我想要po mData,我会得到

代码语言:javascript
复制
<219f>

这是打印一个字节流,因为这是NSData对象的性质。它揭示了您的本地体系结构是小的-endian,但是这并不重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20189830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档