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

时间:2009-07-14 21:36:34

标签: c++ bit-manipulation dbus

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

编辑:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

Dynamic Bitset

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

答案 1 :(得分:0)

您是否考虑过使用具有明确成员大小的结构?例如,如果您有一个字段大小为:

的消息
  • 第一个字段是12位
  • 第二个字段是20位
  • 第3个字段是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;