gpt4 book ai didi

ios - NSData 到原语

转载 作者:太空宇宙 更新时间:2023-11-04 06:32:40 25 4
gpt4 key购买 nike

我有 NSData *data。它的值为 000e

因此十进制值为 14

现在我想把这个值变成原始的NSUInteger

我试过了

NSUInteger *hereIWant14 = (NSUInteger *)data.bytes;

但是 *hereIWant14 值是 3584 十六进制中的 e00 是什么。现在我不知道字节序或类型大小是否存在问题,或者我的想法完全错误,000ee00 相似性纯属偶然。

最佳答案

这与字节顺序有关。使用 Endian.h 中定义的转换宏:

EndianU16_BtoN(value)
EndianU16_NtoB(value)
EndianS32_BtoN(value)
EndianS32_NtoB(value)
EndianU32_BtoN(value)
EndianU32_NtoB(value)
EndianS64_BtoN(value)
EndianS64_NtoB(value)
EndianU64_BtoN(value)
EndianU64_NtoB(value)
etc.

方法签名意味着:

Endian + U for unsigned S for signed + bits + N 是系统的 native 字节序,L 是小字节序,B 是大端

所以如果你有一个内容为 (0x00, 0xE0) 的 NSData,并且你想将它解释为值 14,那么它包含大端顺序的数据,因此你必须使用 EndianU32_BtoN(当然,这个宏是big-endian系统上的identity transform,只在little-endian机器上交换字节)。

重要提示:为了面向 future ,我建议您使用其他东西而不是 NSUInteger,因为这种类型的宽度在不同系统之间可能会有所不同(例如,Apple 将 NSUInteger 定义为 arm64 系统上的 64 位)。因此,要明确位数,请使用 uint32_t 或 uint64_t 等。

编辑:Big-Endian 短值的用法

NSMutableData * data = [[NSMutableData alloc] initWithLength:2];
((unsigned char *)data.mutableBytes)[0] = 0x00;
((unsigned char *)data.mutableBytes)[1] = 0x0E;

NSUInteger integer = NSSwapBigShortToHost(*(unsigned short *)data.mutableBytes);

NSLog(@"%d", integer); // prints 14

关于ios - NSData 到原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18960927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com