2011-05-03 63 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