将NSData转换为float?

时间:2009-12-11 14:53:47

标签: objective-c

最初我认为下面介绍的代码正常工作,“inBuffer”似乎正确地获取了4个字节的数据,而且变量MDD_times也是正确的。

NSData *inBuffer;
float MDD_times;

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

好的,让我扩展这个小点(上面更新的代码),这就是我得到的:

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&gt; float bit按预期工作。

加里

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

如果您确定inFile返回使用相同类型的float和相同的字节顺序编码的数据,那么您的代码应该按预期工作。