0

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

编辑:

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

4

2 回答 2

1

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

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

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

动态位集

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

于 2009-07-14T21:45:19.960 回答
0

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

  • 第一个字段是 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;
于 2009-07-14T21:52:09.730 回答