二进制vs文本协议

时间:2010-03-02 16:06:54

标签: binary protocols

我想知道二进制和基于文本的协议之间的区别是什么。 我读到二进制协议更紧凑/更快处理。 这怎么办?既然你必须发送相同数量的数据?否?

例如,字符串“hello”在二进制格式中的大小有何不同?

7 个答案:

答案 0 :(得分:20)

如果你所做的只是发送文字,那么是的,两者之间的差异不是很大。但是考虑尝试传递类似的东西:

  • 数字 - 你使用数字或二进制的字符串表示吗?特别是对于大数字,二进制文件将更紧凑。
  • 数据结构 - 您如何表示文本协议中字段的开头和结尾?有时,具有固定长度字段的二进制协议更紧凑。

答案 1 :(得分:11)

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

但是,您可以使用像LZO或Zlib这样的库来压缩文本,这几乎和二进制一样紧凑(压缩/解压缩的性能很差。)

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

答案 2 :(得分:3)

字符串“hello”本身的大小不会有所不同。大小/性能差异在序列化引入的附加信息中(序列化是程序如何表示要传输的数据,以便一旦到达管道的另一端就可以重新构建)。

例如,在使用XML(文本序列化方法之一)在.NET中序列化以下内容时:

string helloWorld = "Hello World!";

你可能会得到类似的东西(我知道这不完全正确):

<helloWorld type="String">Hello World!</helloWorld>

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

答案 3 :(得分:2)

如果使用控制位/字节

二进制协议会更好

即代替发送消息:Hello 在二进制文件中它可以是0x01,然后是你的消息(假设0x01是一个代表msg的控制字节)

所以,因为在文本协议中你发送msg:hello \ 0 ...它涉及10个字节 在二进制协议中,它将是0x01Hello \ 0 ...这涉及7个字节

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

答案 4 :(得分:0)

您需要明确协议的一部分以及数据的一部分。 文本协议可以发送二进制数据,二进制协议可以发送文本数据。

协议是消息的一部分状态“我可以连接吗?我有一些数据,我应该把它放在哪里?,你得到了我的答复?太棒了!谢谢,再见!” / p>

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

如果你有一个编码标准,我打赌你可以想出一个字符序列小于'PUSH'这个词所需的4个字节

答案 5 :(得分:0)

有人说二进制协议更安全,例如What should follow the web?中的Mike Hearn。

答案 6 :(得分:-4)

我不会说二进制格式的处理速度更快。如果你看一下CSV或固定字段长度的文本格式 - 它仍然可以快速处理。

我想说,一切都取决于谁是消费者。如果人类在最后(如HTTP或RSS),则无需以某种方式压缩数据,除非压缩数据。

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

我认为,尺寸变化在今天并不重要。对于您的示例,hello将采用与文本格式相同的二进制格式,因为文本格式对于计算机来说也是“二进制” - 只是我们解释数据的方式很重要。