【发布时间】:2021-01-15 13:24:59
【问题描述】:
我有一个必须实施到第二部分的系统。问题是我收到了一个混合字节的浮点数。在下面的示例中,输入是 1E9 (f_orig),接收的是 2.034699e+26 (f_recv)。我做了函数ABCD_to_CDAB_float,但我觉得它很难看。有没有更好的方法来写ABCD_to_CDAB_float(没有两个临时变量已经很好了)?
#include <stdio.h>
#include <float.h>
#include <string.h>
#include <stdint.h>
/* Change float byte order */
float ABCD_to_CDAB_float(float infloat) {
float outfloat;
uint8_t tmp[4];
memcpy(&tmp, &infloat, 4);
uint8_t tmp2[] = {tmp[2], tmp[3], tmp[0], tmp[1]};
memcpy(&outfloat, &tmp2, 4);
return outfloat;
}
int main() {
float f_orig = 1E9; // This is the value sent
printf("f_orig\t%e\n", f_orig);
char str_orig[4];
memcpy(&str_orig, &f_orig, 4);
printf("str_orig\t%x %x %x %x\n", str_orig[0], str_orig[1], str_orig[2], str_orig[3]);
float f_built; // same as f_orig
char str_built[] = {0x28, 0x6B, 0x6E, 0x4E};
memcpy(&f_built, &str_built, 4);
printf("f_built\t%e\n", f_built); // it prints "1E9"
float f_recv; // received float
char str_recv[] = {0x6E, 0x4E, 0x28, 0x6B};
memcpy(&f_recv, &str_recv, 4);
printf("f_recv\t%e\n", f_recv); // converesion was wrong somewhere
char str6[] = {str_recv[2], str_recv[3], str_recv[0], str_recv[1]};
float f_res;
memcpy(&f_res, &str6, 4);
printf("f_res\t%e\n", f_res); // result is fine
printf("%e\n",ABCD_to_CDAB_float(f_recv)); // result is right
return 0;
}
【问题讨论】:
-
不使用变量的目标是什么,您可以使用
XOR做一些事情,但我们需要确切地知道您在寻找什么。 -
您可以通过将
float的地址转换为char *来避免memcpy。 Converting float values from big endian to little endian
标签: c encoding floating-point