C / C ++将二进制数据映射到struct成员

时间:2011-02-11 23:50:54

标签: c++ c data-binding reflection string

让我们说,我有以下文本文件:

清单1:

Endianess=little
AddressModel=32

typedef struct{
  int    x;
  int    y;
  float  f;
  double d;
} A;

instance1:0x0000000100000002000048C19A99999999993C40
instance2:0x00100257000000090000000FBA99359976992397

其中instance1对应于struct A的实例,例如:

清单2:

A->x = 0x00000001         = 1
A->y = 0x00000002         = 2
A->f = 0x000048C1         = -12.5
A->d = 0x9A99999999993C40 = 28.6

任务:

编写一个应用程序,它将文本文件,任意C数据结构和任意内存转储打印出来,并以易于阅读的格式打印出来,重构该结构的实例(例如什么是如清单2所示。)

问题:

  1. 这样做的最佳方式是什么?
  2. 而不是重新发明轮子,是否有任何开源解决方案可以从这个问题中受益?
  3. 需要考虑的事项:

    解决方案必须

    1. 考虑数据类型的长度。
    2. 处理不同的地址模型和字节顺序。
    3. 显示十六进制和该特定数据类型的本机显示。
    4. 采用未链接到您正在编写的程序中的C结构。
    5. 奖金问题:

      处理嵌入式结构的案例:

      typedef struct{
        int    q;
        int    p;
        A      a;  //embedded struct of type A defined in listing 1
      } B;
      

      先谢谢大家!

1 个答案:

答案 0 :(得分:1)

你不能在C或C ++中使用反射,这样就可以了。这意味着您需要编写一个解析器,而不是可以读取C结构定义。真的不是很难。

如果您愿意,您可以自己完成:标记化和解析C并不难。或者你可以使用像lex和yacc这样的工具。或者你可以使用像Boost Spirit这样的C ++库。

一旦有了解析器,就可以在C中构建数据读取器。您不想在C代码中重现该结构。你只是希望能够正确阅读它。

我会在解析步骤中编写一组数据类型和名称。在二进制读取步骤中,逐步执行数组并读取需要读取的许多字节,然后生成输出行。重复,直到数组中的数据类型用完为止。