如何将NSData字节转换为NSNumber或NSInteger?

3
有一个特殊的 NSString initWithData 方法可以抓取比特并将其转换为字符串。但是,在 NSNumber 类引用中我没有找到它。当前,我正在以 NSData 格式从服务器获取原始数据(字节)。我知道在 C 语言中如何使用 memcpyint 指针实现这一点。但是我想知道从 NSData 直接获取这些内容的便捷方法是什么。不需要转换。例如,我得到了一个 00000010 字节,我需要将其转换为值为 2 的 NSNumberNSInteger

如果你知道如何在C语言中实现,那么在Objective-C中也可以做到。只需使用那些方法。使用[myNSData bytes]获取原始字节。如果需要,可以为NSNumber创建一个类别,以便使用initWithData:。 - Matthias Bauch
4个回答

10

NSData只是一个字节的容器,不知道其中包含的数据。 NSStringinitWithData:encoding:方法与此方法相反(它执行相反的操作):

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

因此,要完整回答你的问题,重要的是要知道你的数字最初是如何被强制转换为一个NSData对象的。一旦你知道编码函数,搜索相应的函数就很重要。
从你在问题中提供的信息来看,可能有许多不同的解决方案。然而,你可能可以使用以下类似的方法,使用getBytes:length:将其转换为可用的数字格式在你的NSData对象上。例如:
NSUInteger decodedInteger;
[myDataObject getBytes:&decodedInteger length:sizeof(decodedInteger)];

你可以将decodedInteger的类型更改为适合你的NSData对象中的字节的任何类型。

如果您的对象包含多个值,则需要使用NSRange来提取每个单独的值,并使用sizeof()函数在数据中移动您的范围。 - ikuramedia
谢谢,使用getBytes可以解决问题。虽然它与“initWithData”不同,但仍更符合“objective-c”风格而非纯c。 - Centurion
2
@Centurion 当以这种方式进行字节(反)序列化时,您应该始终考虑字节序。请参见Foundation / NSByteOrder.h中的 'NSSwap...'函数族。 - Costique
@Costique,当使用getBytes时,我是否仍需要考虑这个问题?如果不需要,那么如何显式地将其传递给getBytes调用?目前,我已经使用getBytes解析了几个响应,并且一切正常。 - Centurion
2
@Centurion 是的。原因是在大端和小端系统上,表示内存中数字的字节序列不同。您必须知道序列化数字的字节序,才能正确解释它。如果没有转换就可以工作,那么您的 CPU 和发送 CPU 的字节序相同。但是您不想做出任何假设,因为字节源机器的字节序可能会改变,而且没有什么阻止苹果制造 PowerPC iPad。最好从一开始就正确处理这个问题,因为修复字节顺序是一场噩梦。 - Costique

1

试试这个:

NSNumber *num = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsNSData]; 

编辑:

正如Matthias Bauch指出的那样,这对你的情况不起作用。只有当您的NSNumber对象被归档为NSData对象时,才能起作用。


这只适用于被存档为NSData对象的NSNumber对象。 - Matthias Bauch

1

NSString来拯救:

const unsigned char *bytes = [serverData bytes];
NSInteger aValue = [NSString stringWithFormat:@"%2x", bytes[0]].integerValue;

文档警告不要使用NSScanner处理本地化的十进制数,但在这种情况下并不需要担心。

-3

这里是答案

//Integer to NSData
+(NSData *) IntToNSData:(NSInteger)data
{
    Byte *byteData = (Byte*)malloc(4);
    byteData[3] = data & 0xff;
    byteData[2] = (data & 0xff00) >> 8;
    byteData[1] = (data & 0xff0000) >> 16;
    byteData[0] = (data & 0xff000000) >> 24;
    NSData * result = [NSData dataWithBytes:byteData length:4];
    NSLog(@"result=%@",result);
    return (NSData*)result;
}

请参考https://stackoverflow.com/a/20497490/562812以获取更多详细信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接