分享

c \ c struct union 字节拆分 惯用法

 新用户79878317 2021-07-19

有时候一个 int8 会被拆成好几个成员,比如

  1. Bit 7..5 4..2 1..0
  2. MHDR bits MType RFU Major

0~1 位 表示 major     2~4 位表示 rfu    5~7 位表示 mtype

可以借助位操作解析出 major rfu mtype的值

或者通过下面结构体来

多字节举例

出现在union 全面的是低字节,后面的是高字节

普通电脑上(小端) 0x12345678 如果解析成 struct {uint8_t n1, uint8_t n2, uint8_t n3, uint8_t n4};

n1 是 0x78    n2 是 0x56

  1. /*
  2. 29位扩展帧ID 被如下拆分
  3. 高位 低位
  4. --------------------------------------------
  5. | P | EDP | DP | PF | PS | SA |
  6. --------------------------------------------
  7. 位长度| 3 | 1 | 1 | 8 | 8 | 8 |
  8. --------------------------------------------
  9. | PGN |
  10. */
  11. struct ID1939
  12. {
  13. ID1939(uint32_t id) { value.v = id; }
  14. operator uint32_t() const { return value.v; }
  15. uint8_t p() const { return value.bits.p; }
  16. uint8_t edp() const { return value.bits.edp; }
  17. uint8_t dp() const { return value.bits.dp; }
  18. uint8_t pf() const { return value.bits.pf; }
  19. uint8_t ps() const { return value.bits.ps; }
  20. uint8_t sa() const { return value.bits.sa; }
  21. protected:
  22. union
  23. {
  24. struct
  25. {
  26. uint8_t sa:8;
  27. uint8_t ps:8;
  28. uint8_t pf:8;
  29. uint8_t dp:1;
  30. uint8_t edp:1;
  31. uint8_t p:3;
  32. }bits;
  33. uint32_t v;
  34. }value;
  35. };
  36. TEST(DBCTest, ID1939Struct)
  37. {
  38. ID1939 id(0x12345678);
  39. EXPECT_EQ(id.sa(), 0x78);
  40. EXPECT_EQ(id.ps(), 0x56);
  41. EXPECT_EQ(id.pf(), 0x34);
  42. EXPECT_EQ(id.dp(), 0x12&1);
  43. EXPECT_EQ(id.edp(), (0x12&2)>>1);
  44. EXPECT_EQ(id.p(), (0x12&0b11100)>>2);
  45. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多