【问题标题】:C++: set value to floating point variable by bitsC ++:按位将值设置为浮点变量
【发布时间】:2016-10-19 12:25:53
【问题描述】:

我有一条大消息,必须初始化为默认值。消息是一个有很多子结构、枚举等的结构。我有一个自动生成的消息描述文件,里面包含了消息的逐字段解析:字段起始字节、起始位、长度、类型、默认值。 我已经实现了一种将消息视为位缓冲区并根据描述文件对其进行初始化的机制。但是....我对浮点默认值有疑问。 如何自动按位设置浮点变量?

谢谢!

【问题讨论】:

  • 看情况,浮点成员的默认值应该是多少?如果它是零,那么所有零都可以。
  • 但是,如果您使用 C++ 编程,为什么不能为每个结构设置一个默认构造函数,以正确的方式初始化其所有成员?非虚拟成员函数(如构造函数)不会“污染”结构的数据。
  • 默认值可以推迟,它们事先不知道。描述文件是第三方给我的。
  • 我在下面看到了你的答案,但是....我很好奇你的 MSG_STRUCT_TYPE 是什么样的。特别是,我很好奇为什么必须将int startByte = 28; 定义为msgBuf 的索引。使用正确定义的结构,您不必手动指定这样的索引来到达OutputMsg 中的特定位置,您应该能够引用特定成员的offsetof(),编译器会计算找出那个偏移量是什么。然后,如果您的结构发生变化,偏移量会自动更改。见:en.cppreference.com/w/cpp/types/offsetof
  • startByte 定义仅用于此处的简短类比示例。正如我在原始帖子中提到的,我有一个文件,其中包含结构的定义 - 所有结构字段的起始字节、位、长度和类型。

标签: c++ floating-point bit-manipulation


【解决方案1】:

好吧,我已经设法自己解决了。 假设如下:

MSG_STRUCT_TYPE OutputMsg; // e.g.750 bytes
int startByte = 28; // the start byte of floating point field in the message
float defVal = -1.75f; // the default value for the field above

现在,使用 reinterpret_cast 我们可以进行以下操作:

unsigned char* bytes_to_set = reinterpret_cast<unsigned char*>(&defVal);
unsigned char* msgBuff = reinterpret_cast<unsigned char*>(&OutputMsg);
*reinterpret_cast<float*>(&msgBuf[startByte]) = *reinterpret_cast<float*>(bytes_to_set);

做这个工作。


在实施并检查 njuffa 的评论后,我将其添加为另一个(更简单和更清晰)的答案:

unsigned char* msgBuff = reinterpret_cast<unsigned char*>(&OutputMsg);
memcpy(&msgBuf[startByte], &defVal, sizeof(float);

【讨论】:

  • 使用现代优化编译器,简单的memcpy() 通常是影响不同类型数据之间的此类数据传输的最清晰、不复杂且有效的方法。我建议尝试一下。
  • 有时,我们的大脑会忽略简单的方法而寻找复杂的路径...))我一定会在回去工作的时候尝试一下。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多