我正在解析文件中的标头。 该文件具有一些我希望提取的浮点值。 评论说它是一个float32值,但是我不确定如何提取它。
给出这样的缓冲区,我该如何正确提取它?请注意,这是小尾数法。
unsigned char b[4];
b[0] = 0xa1;
b[1] = 0xb2;
b[2] = 0xc3;
b[3] = 0xd4;
float f = b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
printf("f is %f\n", f);
更清楚地说:问题是,无论文件(缓冲区)中的值是多少,小数始终为.000000。我怎么知道小数点应该在哪里?
答案 0 :(得分:3)
安全的方法:
unsigned char b[sizeof(float)];
float f;
memcpy(&f, b, sizeof(f));
好的编译器很可能会优化对memcpy
的调用,此方法将非常有效。
gcc安全方式
union {
unsigned char b[sizeof(float)];
float f;
}a = {.b = {0xa1, 0xb2, 0xc3, 0xc4}};
printf("%f" , a.f);
或像@AnttiHaapala答案中那样修剪指针
答案 1 :(得分:2)
如果目标体系结构以float32作为表示形式,并且与源体系结构具有相同的字节序,则只需:
float f;
unsigned char *b = (unsigned char *)&f;
b[0] = 0xa1;
b[1] = 0xb2;
b[2] = 0xc3;
b[3] = 0xd4;
printf("f is %f\n", f);
如果数据源和您的目标体系结构的字节序不大匹配,则将索引反转为3
... 0
。如果您还有其他怪异的传统字节序,我很可惜。
请注意,您可以使用memcpy
-为此,您将需要使用辅助缓冲区,而不仅仅是迭代字节的内容。或需要更多代码且不一定与C ++兼容的联合。