我正在使用 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]我没有测试过,所以不知道是否实用,仅供大家参考