2011-05-03 37 views
4

我有一个二进制数据块的NSData对象,我试图使用getBytes:range:来设置一个原语。从NSData对象中提取二进制数据

我可以这样做:

NSData* data = [...get record from file...] 
double value = 0; 
[data getBytes:&value range:NSMakeRange(42, 8)]; 
[someObject setValue:value]; 

我宁可不要使用一个临时变量,因为我有这个文件,我需要阅读很多领域。

是否有一种简单的方法(objc或c)从NSData对象中提取字节,将这些字节转换为某个原始值,并将其分配给一个对象而不使用临时?

谢谢!

回答

6

这不是最漂亮的,但是你可以得到NSData使用的原始数据指针,并将它解引用到正确的位置。

UInt8 *rawData = [theData bytes]; 
[someObject setValue:*((double*)(&rawData[42]))]; 

这涉及到大量铸造的,但你只需要使用一个临时变量,而不是为每个数据类型,它会稍微快一些,你不要反复询问NSData对象特定范围数据的。

+0

谢谢,这看起来像我想要做的...我稍微修改它,以保持编译器安静'const UInt8 * rawData = ...' – 2011-05-03 20:05:41

+0

谢谢,这给我打开了新的视野 – LolaRun 2011-08-22 09:32:45

+0

这不是什么描述呢? – quantumpotato 2015-06-16 18:47:13