2009-12-11 76 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

如果你确信这是与同类型浮动和相同的字节顺序编码的​​返回数据,你的代码应该按预期工作。