【问题标题】:Can unions be used to convert char arrays to float? [duplicate]可以使用联合将 char 数组转换为浮点数吗? [复制]
【发布时间】:2017-10-02 23:47:58
【问题描述】:

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

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

如果我收到一个像这样编码浮点数的 char 数组(数字是组成的)

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;

【问题讨论】:

  • 是的,如果发件人尊重 IEEE 和字节序。但是memcpy(&the_float,the_string_data,sizeof(float)) 实现了同样的目标
  • 请注意,在 C++ 中使用 unon 进行类型双关是非法的
  • 建议的 dup 未使用 char 数组。您应该确保使用unsigned char(并且不要尝试初始化 4 元素数组的 5 个元素)。
  • 注意:不需要硬编码 4. 使用char c[sizeof (float)]; BTW,最好使用unsigned char - 更少的复杂性。
  • @chux 你的意思是我的工会定义中的char c[sizeof(float)],不是吗?关于使用unsigned char 也在同一个定义中对吧?

标签: c++ arrays type-punning


【解决方案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';

【讨论】:

  • 注意要非常小心;如果您不向/从char * 投射,这是由于严格混叠导致的未定义行为。
  • 您在第二个cout 上忘记了您的std::
  • 谢谢@JL2210。您还没有足够的声望来直接编辑吗?
  • @chtz 差不多。还需要 271 个。
猜你喜欢
  • 2021-07-16
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2020-09-02
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多