我正在使用Python开发基本的网络协议,该协议应该能够传输ASCII字符串(读取:以EOL终止)和二进制数据。
为了使后者可行,我选择创建语法,使其包含将要成为二进制字节的字节数。

到目前为止,对于SimpleParse来说,语法看起来像这样[1]:

EOL := [\n]
IDENTIFIER := [a-zA-Z0-9_-]+
SIZE_INTEGER := [1-9]*[0-9]+
ASCII_VALUE := [^\n\0]+, EOL
BINARY_VALUE := .*+
value := (ASCII_VALUE/BINARY_VALUE)

eol_attribute := IDENTIFIER, ':', value
binary_attribute := IDENTIFIER, [\t], SIZE_INTEGER, ':', value
attributes := (eol_attribute/binary_attribute)+

command := IDENTIFIER, EOL
command := IDENTIFIER, '{', attributes, '}'


问题是我不知道如何指示SimpleParse,以下内容将在运行时变成SIZE_INTEGER字节的二进制数据。

原因是终端BINARY_VALUE的定义可以满足我现在的需求,因此无法更改。

谢谢

编辑

我想该解决方案将告诉它在与生产binary_attribute匹配时停止,并让我手动填充AST节点(通过socket.recv()),但是该怎么做呢?

编辑2

不能使用Base64编码或类似方法。

[1]我尚未测试过,所以我不知道它是否切实可行,这只是给您一个主意

最佳答案

如果您希望您的应用程序具有可移植性和可靠性,我建议您仅通过电线传递标准ASCII字符。

不同的计算机体系结构具有不同的二进制表示形式,不同的字长,不同的字符集。有三种解决方法。

首先,您可以忽略这些问题,并希望您只需要在单个平台上实现该协议。

您可以通过两种方法处理所有计算机科学,并为每种可能的数据类型ala CORBA提出一个“基本形式”。

通过网络发送数据时,您可以实践并使用“ sprintf”和“ scanf”的魔力在纯ASCII字符之间来回转换数据。

我还建议您的协议在消息开头或开头附近包含一条消息长度。自制协议中最常见的错误是接收方希望接收的数据量超过发送的数据,并因此永远等待从未发送的数据。

09-20 04:09