可以使用联合体将字符数组转换为浮点数吗?

4

我想知道是否可以使用联合体从接收的字符数组中获取浮点数。假设我定义了以下结构体:

typedef union {
  float f;
  char c[4];
} my_unionFloat_t;

如果我收到一个编码为浮点数的字符数组,格式如下(数字是虚构的):
data[4] = {32,45,56,88};

我可以这样做吗?
my_unionFloat_t c2f;

c2f.c[0] = data[0];
c2f.c[1] = data[1];
c2f.c[2] = data[2];
c2f.c[3] = data[3];

float result = c2f.f;

1
是的,如果发送者尊重IEEE和字节顺序。但是memcpy(&the_float,the_string_data,sizeof(float))可以实现同样的效果。 - Jean-François Fabre
1
建议的dup没有使用char数组。您应该确保使用unsigned char(而不是尝试初始化4个元素的5个元素数组)。 - Weather Vane
1
注意:不需要硬编码4。使用char c[sizeof(float)];。顺便说一句,最好使用unsigned char - 减少复杂性。 - chux - Reinstate Monica
1
@chux,你是不是指的是在我的联合定义中使用char c[sizeof(float)]?关于在同一定义中也使用unsigned char,是这个意思吗? - ndarkness
@ndarkness 是的,typedef union { float f; unsigned char uc[sizeof (float)]; } my_unionFloat_t; 这在 C 中是可以的。请注意有关其他 C++ 问题的注释链接。 - chux - Reinstate Monica
显示剩余7条评论
1个回答

1

在C++中实现最简单的方法是使用 reinterpret_cast

unsigned char data[4] = {32,45,56,88};
float f = reinterpret_cast<const float&>(data);
const unsigned char* ch =  reinterpret_cast<const unsigned char*>(&f);
for(int i=0; i<4; ++i)
    std::cout << +ch[i] << ' ';
std::cout << f << '\n';

1
请注意,您需要非常小心;如果您没有将类型转换为/从 char *,那么由于严格别名规则,这是未定义的行为。 - Justin
你在第二个 cout 上忘记了加上 std:: - S.S. Anne
谢谢@JL2210。你还没有足够的声望来直接编辑吗? - chtz
@chtz 差一点,还需要271个。 - S.S. Anne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接