如何合规实现float序列化?解决MISRA C:2012 11.3违规问题
问题描述
我有一段串口消息编码器的代码:
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);
我尝试以端序无关的方式将float值写入字节流,为此需要逐个访问字节并写入流中。字节映射本身符合MISRA-C规范,但找不到不触发Cppcheck工具11.3规则的合规序列化方法。请问如何合规编码该float值?两种数据类型大小相同,对齐应该不是问题吧?
最终解决方案(更新)
感谢各位解答,尤其是对潜在陷阱的说明。我最终采用了以下方案:
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);
声明:此代码由代码生成器输出,我预先知晓变量大小匹配。此处的移位和掩码看似无意义,但在容器未对齐的场景中会发挥作用。
内容的提问来源于stack exchange,提问作者fschwaiger
相关产品推荐
相关产品推荐

