ios - 将 NSData 转换为 unsigned int 32 数组

标签 ios objective-c cocoa-touch nsdata

我想将 NSData 实例中的 8 个字节转换为包含 2 个项目的 uint32_t 数组。我做了以下操作,但它不正确。

NSLog(@"Challenge data %@",dataChallenge);
uint32_t *data = (uint32_t *)dataChallenge.bytes;
NSLog(@"data0: %08x, data1: %08x", data[0], data[1]);

这是结果:

Challenge data <3ce3e664 dafda14b>
data0: 64e6e33c, data1: 4ba1fdda

数据顺序不正确。

值应该是:

Challenge data <3ce3e664 dafda14b>
data0: 3ce3e664, data1: dafda14b

最佳答案

uint32_t *data = (uint32_t *)dataChallenge.bytes;

例子:

NSData *dataChallenge = [@"12345678" dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"dataChallenge: %@", dataChallenge);
uint32_t *data = (uint32_t *)dataChallenge.bytes;
NSLog(@"data0: %08x, data1: %08x", data[0], data[1]);

NSLog 输出:

dataChallenge: <31323334 35363738>
data0: 34333231, data1: 38373635

注意:字节是颠倒的,因为这是一个lithe-endian机器

使用 memcpy:

NSData *dataChallenge = [@"12345678" dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"dataChallenge: %@", dataChallenge);
uint32_t data[2];
memcpy(data, (uint32_t *)dataChallenge.bytes, dataChallenge.length);
NSLog(@"data0: %08x, data1: %08x", data[0], data[1]);

NSLog 输出:

dataChallenge: <31323334 35363738>
data0: 34333231, data1: 38373635

交换字节顺序:

NSLog(@"data0: %08x, data1: %08x", CFSwapInt32BigToHost(data[0]), CFSwapInt32BigToHost(data[1]));

NSLog 输出:

data0: 31323334, data1: 35363738

注意:有关字节交换的更多组合,请参阅 CFByteOrder.h。

关于ios - 将 NSData 转换为 unsigned int 32 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22003755/

相关文章:

ios - UIActivityViewController 为 Twitter 和 Facebook 发布不同的图像和文本

javascript - Appcelerator/Titanium - 从函数内调用变量

ios - 如何将 NSMutableDictionary setObject 的值赋值成为 indexPath.section 的值?

ios - applicationDidEnterBackground 未运行

ios - 将 UITextField 委托(delegate)设置为所有 UITextField 并为少数文本字段设置 View 动画

ios - touchesMoved 不定期调用

ios uiviewcontroller继承抛出重复符号错误

ios - 以编程方式显示 iPhone 键盘

objective-c - IOS UILocalNotification 在我的应用程序被删除后生效......如何处理这些通知?

objective-c - ‘NSAutoreleasePool’ 在 Ubuntu 上可能无法响应 ‘-drain’