【问题标题】:How do you pass information from an 8 byte array into variable bit size data containers?如何将 8 字节数组中的信息传递到可变位大小的数据容器中?
【发布时间】:2009-07-14 21:36:34
【问题描述】:

我有一个 8 字节的消息,其中消息的不同块映射到不同类型的数据(int、bool 等),并且它们的位大小不同(消息中的 int 值是 12 位等) .)。我只想传递与数据相关的位,但我不确定是否有更好的方法。我目前的想法是创建一个带有向量后端的位数组类型,并有一个模板化的访问器来获取包含在指定类型中的值。虽然在我输入这个的时候,我开始认为所有可能类型的一个很大的联合可以传递给每个数据。

编辑:

消息包含不同类型的数据。例如,一条消息包含一个 8 位整数和 5 个 1 位布尔值,而另一条消息包含一个 16 位时间戳(我自己的类)和一个 8 位整数。

【问题讨论】:

  • 没有看到代码很难说,但这听起来像是位域和联合可能是最佳解决方案的罕见情况之一。
  • 实际上,不,因为众所周知,位域在不同的编译器上具有不同的布局。在结构 {int a:1;诠释 b:1};对于 a 和 b 的 2 的幂完全没有共识。

标签: c++ bit-manipulation dbus


【解决方案1】:

消息是否总是相同的格式/顺序? IE。 12bitsInt|8bitsChar|等如果是这样,一个简单的解决方案是设置适当的位掩码来获取每个特定值。 IE。如果前 12 位(低位)对应一个整数,我们可以这样做:

__uint64 Message; // Obviously has data in it.
int IntPortion = Message & 0x00000111;

这会将消息的前 12 位复制到整数类型的前 12 位。为每个消息块设置适当的位掩码并继续。如果消息格式不是恒定的......那么我可能需要你详细说明一下示例消息。 boost 库还有一些不错的位操作类:

Dynamic Bitset

如果格式不变,可能会有点过分。

【讨论】:

    【解决方案2】:

    您是否考虑过使用具有显式成员大小的结构?例如,如果您有一条消息,其中字段大小为:

    • 第一个字段是 12 位
    • 第二个字段是 20 位
    • 第三个字段是 4 位
    • ...

    您可以定义如下结构:

    typedef struct {
      unsigned int field_1 : 12;
      unsigned int field_2 : 20;
      unsigned int field_3 : 4;
      /* etc */
    } message_t;
    

    假设您在一个简单的 char 数组中包含消息,请将数据复制到 message_t 结构或将其转换为 message_t* :-

    char buffer[8] = /* however it's populated */
    message_t* message_ptr = &buffer;
    int field1 = message->field_1;
    int field2 = message->field_2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多