我正在设计一个私人网络协议。我需要选择字符串的分隔符。
如果分隔符是string01\0string02\0string03\0,则包将类似于\0。
该字符串不仅是ascii,而且是任何最终用户定义的编码字符串,比如utf8或base64编码的二进制数据。
我的目的是制定一个灵活和小规模的协议,因此字符串应该支持某种压缩算法。我想知道分隔符对此是否重要。
发布于 2015-07-24 09:37:14
如果编码是最终用户定义的,它可能包含\0字节,如UTF-16,因此,运行长度编码的字符串可能工作得最好:
\x08string01\x08string02\x08string03或者,如果需要超过255个字节的字符串,请选择一个2字节(最大65535字节)或更多的大端(网络协议约定)值:
\x00\x08string01\x00\x08string02 (ASCII)
\x00\x10\x00s\x00t\x00r\x00i\x00n\x00g\x000\x001 (UTF-16BE)发布于 2015-07-24 13:59:18
除了Mark已经提出的长度编码之外,还可以使用转义字符。设置分隔符字符(例如\0),如果\0出现在数据中,则在其前面放置一个特殊的“转义字符”,以转义其特殊含义。一些协议(如HDLC)使用了这种方法:
...they使用“控制-八进制透明”,也称为“字节填充”或“八位字节填充”。帧边界八进制为01111110,(7E为十六进制表示法)。一个“控制转义八进制”,有位序列'01111101',(7D十六进制)。如果这两个八进制中的任何一个出现在所传输的数据中,则发送一个转义八进制,然后是原始数据八进制,位5倒置。例如,数据序列"01111110“(7E十六进制)将被传输为"01111101 01011110”(“7D5e”十六进制)。
发布于 2015-08-04 16:09:14
如果我是您,我将根据协议的版本假定字符串格式(即ASCII或UTF8或其他什么)。版本协议我认为你应该是协议握手(初始化)的一部分。例如:
1. Client opens TCP connection to Server
2. Server> \x... <-- magic
3. Server> \x01 <-- Protocol version
4. Client> \x00 <-- Ok然后,对字符串使用字符串终止,使用数据大小头,前面的字符串发送如下:
Client or Server> 0x000f <-- following data will be 100 bytes
Client or Server> .... // 100 of raw data is being transmitted and then decoded using the right encoding that is protocol coupled.我认为这样的协议更容易理解,更容易扩展。
https://stackoverflow.com/questions/31602108
复制相似问题