Ios 将NSData转换为无符号整数32数组

Ios 将NSData转换为无符号整数32数组,ios,objective-c,cocoa-touch,nsdata,Ios,Objective C,Cocoa Touch,Nsdata,我想将NSData实例中的8个字节转换为包含2个项的uint32\u 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> da

我想将
NSData
实例中的8个字节转换为包含2个项的
uint32\u 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
质询数据
数据0:64e6e33c,数据1:4ba1fdda
数据顺序不正确

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: 3ce3e664, data1: dafda14b
质询数据
数据0:3ce3e664,数据1:dafda14b
uint32\u t*数据=(uint32\u 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输出:

数据挑战:
数据0:34333231,数据1: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输出:

数据挑战:
数据0:34333231,数据1:38373635

交换字节顺序:

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

数据0:31323334,数据1:35363738


注:有关字节交换的更多组合,请参见CFByteOrder.h。下面的逻辑将NSData完美地转换为整数。字节的长度并不重要。它只是工作

NSData *data;
NSString *stringData = [data description];
stringData = [stringData substringWithRange:NSMakeRange(1, [stringData length]-2)];

unsigned dataAsInt = 0;
NSScanner *scanner = [NSScanner scannerWithString: stringData];
[scanner scanHexInt:& dataAsInt];

什么不起作用?你确定dataChallenge中有8个字节吗?@JoshCaswell:是的,我确定dataChallenge是8个字节。不起作用的东西是什么?(没有任何细节地说“不正确”是没有用的。解决问题的第一步也是最重要的一步是准确地描述它。)您会注意到这些值的顺序相反。在Wikipedia中查找“endianness”。这会留下
NSData
实例所拥有的字节,这可能是可取的,也可能是不可取的
memcpy()
,正如OP所使用的,这意味着数据可以比
NSData
实例更长寿<代码>-[NSData getBytes:length::也可以实现这一点。用户选择。这是关于方法的。@Zaph:我试过你的代码,但数据顺序不正确。这是Challenge数据data0:64e6e33c,data1:4BA1FDDA如果你通过网络获取数据,@user,现在是big-endian,你需要将其交换到little。@JoshCaswell:我如何交换到little-endian?