我有来自一个串口消息编码器的以下代码:
uint32_t bits;
*((float *) &bits) = some_external_variable;
pFrame->data[0x2C] = ((uint8_t)(bits >> 0x18) & 0xFFu);
pFrame->data[0x2D] = ((uint8_t)(bits >> 0x10) & 0xFFu);
pFrame->data[0x2E] = ((uint8_t)(bits >> 0x08) & 0xFFu);
pFrame->data[0x2F] = ((uint8_t)(bits >> 0x00) & 0xFFu);
我正在try 以一种独立于字符顺序的方式将float
值放入字节流.要做到这一点,我(我想我)需要访问字节并将它们单独放到流中.
字节映射本身似乎符合MISRA-C,但我想不出任何方法来以兼容的方式序列化浮点,而不使用cppcheck
工具触发规则11.3.
我如何以兼容的方式对浮点数进行编码?
这两种数据类型应该具有相同的大小,所以对齐在这里不应该是问题?
最新情况:
感谢你的回答,特别是对隐藏trap 的澄清.我最终 Select 了这个解决方案:
uint32_t bits;
(void)memcpy(&bits, some_external_variable, sizeof(bits));
pFrame->data[0x2C] |= ((uint8_t)(bits >> 0x00) & 0xFFu);
pFrame->data[0x2D] |= ((uint8_t)(bits >> 0x08) & 0xFFu);
pFrame->data[0x2E] |= ((uint8_t)(bits >> 0x10) & 0xFFu);
pFrame->data[0x2F] |= ((uint8_t)(bits >> 0x18) & 0xFFu);
免责声明:这段代码是我的代码生成器的输出,从该上下文中我预先知道变量的大小匹配.在这里,大范围的移位和口罩看起来像是无法操作的,但在容器未对准的情况下,口罩将发挥作用.