首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRLF与LF对零网络协议设计

CRLF与LF对零网络协议设计
EN

Stack Overflow用户
提问于 2015-07-24 04:18:15
回答 3查看 358关注 0票数 0

我正在设计一个私人网络协议。我需要选择字符串的分隔符。

如果分隔符是string01\0string02\0string03\0,则包将类似于\0

该字符串不仅是ascii,而且是任何最终用户定义的编码字符串,比如utf8或base64编码的二进制数据。

我的目的是制定一个灵活和小规模的协议,因此字符串应该支持某种压缩算法。我想知道分隔符对此是否重要。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-24 09:37:14

如果编码是最终用户定义的,它可能包含\0字节,如UTF-16,因此,运行长度编码的字符串可能工作得最好:

代码语言:javascript
复制
\x08string01\x08string02\x08string03

或者,如果需要超过255个字节的字符串,请选择一个2字节(最大65535字节)或更多的大端(网络协议约定)值:

代码语言:javascript
复制
\x00\x08string01\x00\x08string02                 (ASCII)
\x00\x10\x00s\x00t\x00r\x00i\x00n\x00g\x000\x001 (UTF-16BE)
票数 1
EN

Stack Overflow用户

发布于 2015-07-24 13:59:18

除了Mark已经提出的长度编码之外,还可以使用转义字符。设置分隔符字符(例如\0),如果\0出现在数据中,则在其前面放置一个特殊的“转义字符”,以转义其特殊含义。一些协议(如HDLC)使用了这种方法:

...they使用“控制-八进制透明”,也称为“字节填充”或“八位字节填充”。帧边界八进制为01111110,(7E为十六进制表示法)。一个“控制转义八进制”,有位序列'01111101',(7D十六进制)。如果这两个八进制中的任何一个出现在所传输的数据中,则发送一个转义八进制,然后是原始数据八进制,位5倒置。例如,数据序列"01111110“(7E十六进制)将被传输为"01111101 01011110”(“7D5e”十六进制)。

票数 0
EN

Stack Overflow用户

发布于 2015-08-04 16:09:14

如果我是您,我将根据协议的版本假定字符串格式(即ASCII或UTF8或其他什么)。版本协议我认为你应该是协议握手(初始化)的一部分。例如:

代码语言:javascript
复制
 1. Client opens TCP connection to Server 
 2. Server> \x... <-- magic
 3. Server> \x01 <-- Protocol version 
 4. Client> \x00 <-- Ok

然后,对字符串使用字符串终止,使用数据大小头,前面的字符串发送如下:

代码语言:javascript
复制
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.

我认为这样的协议更容易理解,更容易扩展。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31602108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档