2009-12-11 107 views
0

最初我以爲下面提供的代碼正在工作,「inBuffer」似乎正確地獲得了4字節的數據,而且變量MDD_times也是正確的。將NSData轉換爲浮點數?

NSData *inBuffer; 
float MDD_times; 

// FLOAT_002 
inBuffer = [inFile readDataOfLength:sizeof(float)]; 
[inBuffer getBytes: &MDD_times length:sizeof(float)]; 
NSLog(@"Time: %f", MDD_times); 

OK讓我對這個小(以上代碼更新)擴大,這就是我得到:

inBuffer = <3d2aaaab> 
MDD_times = -1.209095e-12 (this will be 0.0416667 bigEndian) 
NSLog(@"Time: %f", MDD_times) = Time: -0.000000 

它大概的NSLog不能容納浮點值,我翻了個字節在浮動到bigEndian和預期值「0.0416667」顯示就好了。至少我知道NSData> float位按預期工作。

加里

回答

6

這裏有一些代碼,我必須在給定的偏移量在緩衝區中執行此操作。當文件採用大端格式時,無論主機字節順序如何,這都應該可以工作。

union intToFloat 
{ 
    uint32_t i; 
    float fp; 
}; 

+(float)floatAtOffset:(NSUInteger)offset 
       inData:(NSData*)data 
{ 
    assert([data length] >= offset + sizeof(float)); 
    union intToFloat convert; 

    const uint32_t* bytes = [data bytes] + offset; 
    convert.i = CFSwapInt32BigToHost(*bytes); 

    const float value = convert.fp; 

    return value; 
} 
2

如果你確信這是與同類型浮動和相同的字節順序編碼的​​返回數據,你的代碼應該按預期工作。