You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合规实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:03:32