将十六进制转换为浮点

时间:2020-07-14 20:09:44

标签: c hex

我正在解析文件中的标头。 该文件具有一些我希望提取的浮点值。 评论说它是一个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。我怎么知道小数点应该在哪里?

2 个答案:

答案 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 ++兼容的联合。