0

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

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

这个问题因为太模糊而被搁置,所以我会尽量说清楚:

我正在寻找一种语言:

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

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[]))

如果这个问题仍然太模糊,请解释我应该在评论中添加什么。谢谢!

4

1 回答 1

0

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

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

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

PLC 世界有许多不同的布局机制,但这些都非常牢固地连接到它们的生态系统中,因此并没有真正的帮助。

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

于 2014-08-24T21:56:25.853 回答