我有一个8字节的消息,其中消息的不同块被映射到不同类型的数据(int,bool等),并且它们的位大小不同(消息中的int值为12位等) )。我想只传递一个数据所涉及的位,但我不确定是否有更好的方法。我目前的想法是使用向量后端创建一个数组类型,并使用模板化访问器来获取指定类型中包含的值。虽然当我输入这个时,我开始认为所有可能类型的一个伟大的联合可以传递给每个数据。
编辑:
消息包含不同类型的数据。例如,一条消息包含一个8位int和5个1位bool,而另一条消息包含一个16位Timestamped(我自己的类)和一个8位int。
答案 0 :(得分:1)
这些消息的格式/顺序是否相同? IE浏览器。 12bitsInt | 8bitsChar |等。如果是这样,一个简单的解决方案是设置适当的位掩码来获取每个特定值。 IE浏览器。如果前12位(低位)对应于我们可以做的整数:
__uint64 Message; // Obviously has data in it.
int IntPortion = Message & 0x00000111;
将消息的前12位复制到整数类型的前12位。为消息的每个块设置适当的位掩码并继续。如果消息格式不是常数......那么我需要你详细说明一个示例消息。此外,boost库还有一些很好的位操作类:
如果格式不变,可能会有点过分。
答案 1 :(得分:0)
您是否考虑过使用具有明确成员大小的结构?例如,如果您有一个字段大小为:
的消息你可以定义一个结构:
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;