二进制协议与文本协议

28

我想知道二进制协议和文本协议之间的区别。 据我所知,二进制协议更紧凑、处理速度更快。 这是怎么回事呢?因为你必须发送相同数量的数据吗?不是吧?

例如,字符串“hello”在二进制格式下的大小会有什么不同吗?


4
一个更有趣的问题是何时选择二进制或文本协议,即它们的一般(不)优点是什么。Max E.答案中的链接在这里是有帮助的。 - Oben Sonne
这是一个更有趣的问题,当你已经知道二进制和文本协议之间的区别时,但像我这样的人还需要学习 :) - Gaston Sanchez
可能是二进制协议已死?的重复问题。 - Eric J.
又是一个重复问题:二进制协议与文本协议 - Maciej Łoziński
7个回答

25

如果你所要传输的只是文本,那么对于这两者的区别并不是很显著。但是考虑一下这些需要传输的内容:

  • 数字 - 你会使用数字的字符串表示还是二进制表示呢?特别是对于大量的数字,二进制表示更加紧凑。
  • 数据结构 - 在文本协议中如何标记字段的起始和结束?有时使用具有固定长度字段的二进制协议更加紧凑。

12

在可读性、重新实现的易度和调试的易度方面,文本协议更好。而二进制协议更为紧凑。

然而,你可以使用像LZO或Zlib这样的库来压缩你的文本,这几乎和二进制一样紧凑(在压缩/解压缩性能上只有非常小的损失)。

您可以在此处阅读更多信息:
http://www.faqs.org/docs/artu/ch05s01.html


2
您还可以压缩二进制数据。将数字作为文本进行传输,使用gzip压缩比纯数字慢得多。 - bokan
1
这个链接对我来说是一个空白页面。这里是从Archive.org获取的最新版本:https://web.archive.org/web/20191026160049/http://www.faqs.org/docs/artu/ch05s01.html - Maciej Łoziński

6

如果您正在使用控制位/字节,则二进制协议更好。

例如,发送消息“Hello”,在二进制中可以用0x01后跟您的消息(假设0x01是表示消息的控制字节)。

因此,在文本协议中,您发送消息:hello\ 0需要10个字节,而在二进制协议中,它将是0x01Hello\ 0,这只需要7个字节。

另一个例子,假设您想发送数字255,在文本中需要3个字节,而在二进制中只需要1个字节,即0xFF。


通常情况下,为了支持更大的整数,它会使用4个原始字节(0x0000_00FF),在文本协议中您还必须计算分隔符,因此至少需要4个字节("255" + 1)。 - Roger Pate
@Roger Pate:关键是,与文本协议相比,二进制协议具有潜在的更高熵值。如果我知道数字在1到255之间,为什么要使用整数来编码它?我也可以反过来举例子:如果确实需要大量数字(例如从1到4,294,967,295的整数),那么任何大于999的数字都可以使用32个固定位而不是4个字节更有效地编码。 - Arne
@Caffeine:如图所示,我使用“byte”表示“8个位”,因此32个位等同于4个字节。 - Roger Pate
@Roger Pate:这是我的笔误,我想说的是ASCII编码超过4个字节(包括分隔符)。 - Arne

3
字符串 "hello" 本身的大小不会有所不同。大小/性能的差异在于序列化引入的附加信息(序列化是程序如何表示要传输的数据,以便在到达管道的另一端时可以重新构造它)。例如,在 .NET 中使用 XML(其中一种文本序列化方法)对以下内容进行序列化:
string helloWorld = "Hello World!";

你可能会得到类似以下内容的东西(我知道这不是精确的):
<helloWorld type="String">Hello World!</helloWorld>

二进制序列化能够在没有额外标记的情况下以二进制形式本地表示数据。

0

0

你需要清楚协议的部分和数据的部分。文本协议可以发送二进制数据,而二进制协议可以发送文本数据。

协议是消息中陈述“嗨,我能连接吗?我有一些数据,应该把它放在哪里?你有我的回复吗?太好了!谢谢,再见!”的部分。

在二进制协议中,每个转换位(可能)都要小得多。以基于文本的HTTP为例:

如果你有一个编码标准,我敢打赌你可以想出比单词“PUSH”所需的4个字节更小的字符序列。


2
另一方面,3个字节的大小并不是“非常小”。是的,它可以累加,但有时人们会因为潜在的75%节省而感到兴奋,并且不再深入研究。(顺便说一下,我也犯过这种错误很多次。) - Max E.

-4

我不会说二进制格式更快处理。如果你看一下CSV或定长文本格式,它们仍然可以被快速处理。

我认为,一切都取决于谁是最终用户。如果人类是最终用户(例如HTTP或RSS),那么除了压缩数据之外,没有必要以某种方式压缩数据。

二进制协议需要解析器/转换器,难以扩展和保持向后兼容性。在协议栈中越高,人性化的协议就越多(TCP是二进制的,因为数据包必须由路由器高速处理,但XML更加人性化)。

我认为,大小变化今天并不重要。对于你的例子,hello在二进制格式和文本格式中将占用相同的空间,因为文本格式对于计算机来说也是“二进制”的——只有我们解释数据的方式不同而已。


8
二进制格式的处理速度往往会更快,因为它们可以更好地匹配机器表示。HTTP不仅用于计算机之间的通信,也用于计算机与其他设备的通信。相比文本协议,二进制协议需要更少的解析器/转换器。在协议栈中越往上,协议就越抽象,不是面向人类的。而二进制可以被视为面向人类的,只要你有一个好的阅读器(那么GIF或JPG呢?)。大小变化可能非常重要-想想移动设备和移动网络。 - MarkJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接