如何在char *中打包结构所需的位?

时间:2010-09-30 08:13:18

标签: c++ bit-packing

语言:C ++

我正在处理位打包(从给定数据中提取所需的位并将它们打包在char *中)。我的代码目前支持:   - 整数   - 人物   - 字符串

现在,如果我必须存储结构所需的位,我应该怎么做呢?我的意思是我应该期望什么作为通用代码w.r.t结构的输入参数?

这个问题可能含糊不清,我不期待直接的回答,甚至提示和指示也很受欢迎。

3 个答案:

答案 0 :(得分:2)

请查看this以获取非常精简的格式,或使用标准的编组格式,例如json,xml,boost序列化等,并为自己保留白发。

答案 1 :(得分:0)

正如piotr已经建议的那样:尝试使用现有的库进行编组。

然而,既然你已经自己做了:
如果您支持的基元可以表示为字节,那么您不应该打包(可能会对该术语产生一些混淆),否则请考虑使用std::bitset
因为C ++不支持reflection,所以在C ++中以通用,安全和可移植的方式对字节打包结构没有任何帮助,所以准备为每个结构编写一个函数来打包每个基元和每个成员结构。登记/> 重载确实有助于以通用方式调用这些函数,因此可以一般地完成容器(向量...)的打包。但是,如果你想要这个,那么更喜欢自由函数而不是成员函数,以避免在打包基元和打包结构之间产生差异。

示例:

void Pack(const MyStruct& str, Packer& pack)
{
  Pack(str.int1, pack);
  Pack(str.string1, pack);
  Pack(str.otherStruct, pack);
}  

答案 2 :(得分:0)

您可以使用reinterpret_cast<char*>()来访问结构,就好像它是char*一样:

#include <iostream>
using namespace std;

struct myStruct
{
    char a; int b;
};

int main(int argc, char* argv[])
{
    myStruct instance = { 10, 100 };

    //Treat the myStruct instance as though it were a char*
    char* pchar = reinterpret_cast<char*>(&instance);

    //Output the values of the bytes to the console
    for(int i = 0; i < sizeof(instance); i++)
        cout << (int)pchar[i] << endl;

    getchar();
    return 0;
}

但请注意,由于对齐,并非所有字符都包含有意义的数据。至少可以使用pack编译指示在visual studio中修复此问题。但结果仍然是高度依赖于架构/编译器的。

因此,如果你想以所有可移植/可维护的方式打包字节(即你将在现实世界中使用它),我高度建议使用piotr提到的一种序列化方法。