当前位置: 首页 > 知识库问答 >
问题:

指定二进制电报/协议的良好(标准化)方法

蔚楷
2023-03-14

我正在寻找一种指定二进制数据的技术规范方法。我正在寻找XML模式描述(XSD)之类的东西。

目的是使用该格式生成可以正确解释二进制序列的程序;即编程语言绑定。这就像XSD的许多框架可以生成OO编程语言中的类,可以表示XML-Data、解析和序列化。尽管如此,方法论需要具有高度的人类可读性,以便领域专家可以指定和解释此文本规范。

到目前为止,我只找到了人类可读的语法。在许多标准中使用了ASCII-Art,例如在RFC或AMQP中,如下所示:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                        TCP Header Format

然而,这几乎是机器可读的。

有时我会看到扩展的巴科斯诺尔形式的规范。然而,技术领域的人并不能真正理解这一点,我也不知道有什么标准建议使用这种方法来指定二进制数据。

有人能提出合适的方法/标准吗?

干杯,豪克

共有1个答案

慕翰学
2023-03-14

您的问题表达得很好,但前提是有一种格式最适合满足冲突约束。

相反,应分别为人机消费选择最佳格式,并在两者之间自动转换。根据您的需要,此映射可以是完全双向的,或者一种格式可以从另一种格式单独派生出来。

一旦您采用了自动转换模式,您将发现不再过度限制解决方案空间,并且您将能够为真正的两个独立目标集(人的需求和机器的需求)而不是一个组合目标集进行优化。

 类似资料:
  • 我们说,要实现 Memcached 的 GET, SET, 和 DELETE 操作。我们仅仅关注这些,但 memcached 协议有一个通用的结构,只有少数参数改变为了改变一个请求或响应的意义。这意味着您可以轻松地扩展实现添加其他命令。一般协议有 24 字节头用于请求和响应。这个头可以分解如下表14.1中。 Table 14.1 Sample Memcached header byte struc

  • 如何定制协议 实际上制定自己的协议是比较简单的事情。简单的协议一般包含两部分: 区分数据边界的标识 数据格式定义 一个例子 协议定义 这里假设区分数据边界的标识为换行符”\n”(注意请求数据本身内部不能包含换行符),数据格式为Json,例如下面是一个符合这个规则的请求包。 {"type":"message","content":"hello"}   注意上面的请求数据末尾有一个换行字符(在PHP中

  • 想象一下,我有一个简单的CQL表 在许多情况下,人们会希望利用Cassandra的无模式本质,只设置一些值,例如 当编写应用程序以写入Cassandra集群中的CQL表时,出于性能原因,需要立即使用准备好的语句来完成此操作。 这由不同的驾驶员以不同的方式处理。例如,Java驱动程序引入了(在CQL二进制协议修改的帮助下)使用命名绑定变量的机会。非常实用:CASSANDRA-6033 我想知道的是,

  • 我正在构建一个软件来远程控制连接到另一台PC的无线电硬件。 我计划使用ZeroMQ进行传输,并使用类似于RPC的请求-回复,其上有表示操作的不同消息。 虽然我的大多数消息只是一些控制和状态信息,但应该可以选择设置要传输的数据blob或请求要接收的数据blob。这些数据blob通常在5-10MB的范围内,但也应该可以使用最大100MB的较大blob。 对于消息格式,我发现google协议缓冲区非常有

  • 由于TCP是基于流的,客户端发送的请求数据是像水流一样流入到服务端,服务端探测到有数据到来后应该检查数据是否是完整的,因为可能只是一个请求的部分数据到达服务端,甚至可能是多个请求连在一起到达服务端。如何判断请求是否全部到达或者从多个连在一起的请求中分离请求,就需要规定一套通讯协议。 在WorkerMan中为什么要制定协议? 传统PHP开发都是基于Web的,基本上都是HTTP协议,HTTP协议的解析