将NSdata转换为字节&然后将前n个字节转换为int

时间:2011-09-07 07:44:32

标签: iphone objective-c ipad nsdata

我有一个NSData对象,首先我要将NSData对象转换为字节,然后读取此NSData对象中的前四个字节&然后将前四个字节转换为等效的整数值。 关于如何解决这个问题的任何想法?

如何将所有四个字节转换为单个正整数值?

3 个答案:

答案 0 :(得分:5)

从原始数据中获取int是不明确的:数据来自何处?你想要什么尺寸的int?你想让他们签名或签名吗?你期望什么字节顺序?

所以这里有一个场景:您获得的数据来自外部进程编码的流,该进程以big-endian顺序提供32位有符号整数。这是你如何做到的:

NSData *dataFromStream = functionThatReturnsNSData();
SInt32 *signedInt32pointer = [dataFromStream bytes];
SInt32 unSwappedInt32 = *signedInt32pointer;
SInt32 reorderedInt32 = CFSwapInt32BigToHost(unSwappedInt32);

RTFM核心基础内存管理编程指南的字节排序和字节交换部分。

答案 1 :(得分:4)

这很简单。使用bytes获取字节,然后转换为unsigned char*

unsigned char *n = [yourNSData bytes];
int value1 = n[0];
int value2 = n[1];
int value3 = n[2];
int value4 = n[3];

更新

要将此转为单int,假设bytes包含有效的int

int result = *(int *)n;

答案 2 :(得分:0)

int n ; // first n bytes
NSData *data; // your data

NSData *subData = [data subdataWithRange:NSMakeRange(0, n)]; // make sure if data has n bytes

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

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