按位结构定义语言生成c ++代码

时间:2014-08-24 21:12:08

标签: c++ data-structures metalanguage

在提出任何问题之前:我正在处理实际的硬件。

我正在搜索一种元语言,它允许我指定数据结构内容,其中字段具有不同的位长(这包括1,3或24或48位长的字段),关于字节顺序,并将生成访问数据的C ++代码。

这个问题由于过于模糊而被搁置,所以我会尽量让它变得清晰:

我正在寻找一种语言:

  • 接受简单的结构描述并生成有用的C ++代码,
  • 允许精确指定从1位到多个(最多8个)字节长度的整数,以及数据(通常是字符串),
  • 会使我无需转换endianess,
  • 产生精确,可预测的输出,不带有开销(如协议缓冲区)

ASN.1听起来几乎是好的,但它增加了自己的开销(意思是,我不能产生一个简单的结构,有2个字节分成4个半字节) - 我正在寻找的是一种语言,将提供结构的精确表示。

例如,我想抽象一下:

struct Command {
  struct Record {
    int8_t track;
    int8_t point;
    int8_t index;
    int16_t start_position;  // big endian, misaligned
    int32_t length;          // big endian, misaligned;
  } __attribute__((packed)); // structure length = 11 bytes.

  int8_t current       : 1;
  int8_t command       : 7;
  int8_t reserved;
  int16_t side         : 3;  // entire int16_t needs to be
  int16_t layer        : 3;  // converted from big endian, because
  int16_t laser_mark   : 3;  // this field spans across bytes.
  int16_t laser_power  : 3;
  int16_t reserved_pad : 2;
  int16_t laser_tag    : 2;
  int32_t mode_number  : 8;  // again, entire 32 bit field needs to be converted
  int32_t record_count : 24; // from big endian to read this count properly.

  Record records[];
} __attribute__((packed));

以上内容需要精确打包到携带8 + record_count * 11字节的结构,所有字节都准确形成,没有附加数据,没有设置额外的位或字节。

以上是只是一个例子。它变得简单,所以我不会使用通常有数百个字段的实际结构来阻塞网站。它已经简化,但显示了我期待看到的许多功能(其余两个功能是48或64位整数和普通数据(bytes []))

如果这个问题仍然过于模糊,请解释我应该在评论中添加的内容。谢谢!

1 个答案:

答案 0 :(得分:0)

一个跟踪单个字段大小的简单表格,用于将每个元素的偏移分离到您的结构中听起来像最简单的解决方案。这不会扩展到深层嵌套的结构,但可以调整为支持处理您标识的未分配的位案例。

然后,您可以使用它来生成常量甚至命名属性访问器,以提取和更新各个字段。鉴于单个元素的大小,宏可能会使生活更加艰难,但任何主流编译器都应该内联代码。您的里程数可能会因基于模板的实施而有所不同。

如果您可以为应用程序(主机和设备)的双方使用通用表示来进一步降低转录错误的可能性,那将有所帮助。

PLC世界有许多不同的布局机制,但这些机制都非常硬连接到他们的生态系统中,因此无法提供帮助。

或者,如果您有可用的工具,您可以考虑使用类似ASN.1结构的表示。在极端情况下,您甚至可以使用开源生成器直接从MIB中提供未编码的生成器。