2

我正在尝试找到一种“元语言”,可用于为成员定义结构和获取/设置代码。问题是该结构已经存在于代码中,并且这种“元语言”将作为原始手动编码结构的逐位替换,以允许生成描述结构的标头。关键是这些结构被用作 C# 应用程序和嵌入式设备之间协议的一部分(不是基于 linux 的,认为像 PI​​C 或 CM0 一样更小,更受限制。)元语言将充当

  • 结构成员的文档
  • 为 get/set 操作生成 C# 结构和实现
  • 生成打包的 ANSI-C 结构和获取/设置函数

元语言需要支持

  • 枚举定义(具有指定的大小 - 即 uint16_t、uint8_t 或更小的多位枚举)
  • 位数组(指定大小 - 即 48 位数组被打包成 6 个字节,)
  • 位结构/枚举数组(指定大小 - 即 48 个索引的 2 位结构为 12 个字节,)
  • 字节序和位序规范,
  • 生成可以通过生成的 ANSI-C 代码或 C-sharp 代码直接读取的二进制结构,以便通过网络发送。

在收到数据时对数据进行一些有限的验证也会很好。

到目前为止,我已经看过

  • BSON
  • 蚀刻
  • Hessian Avro
  • 消息包
  • 协议缓冲区
  • 节约

所有这些对于文档和构建新协议时都非常有用,但在尝试保持与现有协议的兼容性时,由于数据编组中固有的类型编码,这些都不足。

我还查看了 ASN.1 的 ECN 编码,但这似乎太难以理解,导致文档出现问题。

我已经查看了从 C 结构生成 C# 结构,但那里没有一个好的选择。

有什么建议吗?

4

1 回答 1

1

你想要的是一个程序转换系统

这些工具可以读取任意计算机语言实例,然后将它们转换为其他有效的语言实例,有时是相同的语言,有时是不同的语言。它们是通用的,因为您可以向它们提供您要操作的语言的描述,然后它们可以对这些语言进行操作。

这个领域的好工具可以让你根据感兴趣的语言的(“表面”)语法编写代码转换,基本上是以“如果你看到这个,用那个替换它”的形式。

对于 OP 的场景,基本的转换是“如果你在结构中看到这个插槽,用相应的 getter 和 setter替换它,以及目标语言的替换结构成员。

在您的情况下,您需要在 3 个场景之间进行选择:

  • 定义用于指定数据结构的抽象语言,并构建从规范语言映射到 C# 和 C 的程序转换。
  • 确定 C 数据声明为引​​用,并生成相应的 C# 代码。
  • 确定 C# 数据声明为引​​用,并生成相应的 C 代码。

然后您必须坐下来,为工具定义语言(如果尚未定义),然后构建转换。

(完全披露:我构建了这样一个工具。请参阅我的简历)。

于 2016-04-21T16:42:25.647 回答