代码之家  ›  专栏  ›  技术社区  ›  messenger

如何将信息从8字节数组传递到可变位大小的数据容器中?

  •  0
  • messenger  · 技术社区  · 17 年前

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

    编辑:

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

    2 回复  |  直到 17 年前
        1
  •  1
  •   DeusAduro    17 年前

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

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

    这将把消息的前12位复制到整数类型的前12位。为消息的每个块设置适当的位掩码并继续。如果消息格式不是常量。。。我需要你用一个例子来详细说明。此外,boost库还有一些不错的位操作类:

    Dynamic Bitset

    但是,如果格式保持不变,可能会有过大的杀伤力。

        2
  •  0
  •   DaveR    17 年前

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

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

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

    假设消息位于简单的字符数组中,则可以将数据复制到 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;