【问题标题】:Is there an advantage of sending binary packets over strings?通过字符串发送二进制数据包有优势吗?
【发布时间】:2013-02-28 13:13:42
【问题描述】:

标题说明了一切。基本上我使用 TCP 进行客户端-服务器设置,我想知道在通过 tcp 发送数据之前将字符串转换为二进制是否有优势?

【问题讨论】:

  • 字符串是二进制的。它们通常被认为是人类可读的。
  • 所以没关系。我猜将字符串转换为二进制是一种处理能力的浪费,对吧?
  • 取决于。如果您的字符串是十六进制值的文本表示,例如$txt = '0x12 0x23 0x34 等,您可以通过转换为原始数值来节省几个字节,发送 3 个字节而不是 14 个。
  • 好的,所以它的字节空间不同。您为什么不将此作为答案发布?
  • 没有正确/错误的答案。例如如果您正在编写网络服务器并发送 html 会怎样? “二进制化”没有意义,因为 html 无论如何都应该是纯文本。这取决于您发送的内容、接收端的预期以及转换成本是否超过节省的带宽。

标签: string binary client-server packet tcp-ip


【解决方案1】:

字符串是二进制数据,或者至少可以很容易地转换成这样的,byte[],用

static byte[] GetStringBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

如果您对发送的数据进行压缩/编码,无论它最初是作为字符串还是二进制数据,您很可能会发送相同的总字节数。

【讨论】:

  • 啊,评论员打败了我。说了同样的话!
【解决方案2】:

在绝大多数情况下没有真正的优势。此外,二进制数据往往更依赖于平台,因此如果您想将客户端/服务器扩展到多平台环境,您最好还是坚持使用字符串。

【讨论】:

    【解决方案3】:

    有些数据是用二进制编码的,比如DER

    如果您的应用程序需要发送这些类型的数据,您可以直接发送二进制文件。例如,certificate of CA。如果您将其作为base64 之类的字符串发送,则为needs more size to represent it

    在某些较低级别,如 TCP,两个实体之间共享信息(握手)是使用二进制,因为它的大小、性能和容错性。

    但作为需要敏捷发展的应用程序开发人员,除了大小之外,您还需要考虑许多其他因素,例如兼容性和维护。假设您需要用二进制数据响应一些元数据,您可能需要使用 JSON 来表示:

    {
      "version": 1,
      "data": "base64 encoded data"
    }
    

    对于客户来说事情会变得更容易,因为有大量工具可以帮助解析 JSON,而且当您无需工具即可查看数据(人类可读)时,调试起来会更容易。另一方面,二进制编码(如 DER)你必须升级你的协议文档,让客户可以轻松地将他们的代码升级为新格式,你还需要考虑向后/向前兼容。

    虽然有一些工具可以帮助二进制编码更加兼容和可维护,比如Apache ThriftProtocol BufferApache Avro

    更深入地了解性能方面。除非您正在比较有无编码/解码过程(这很容易比较哪个更好)。你必须做一些负载测试来检查它。

    例如有一些extremely fast JSON parser,它可以轻松击败一些声称比其他性能更好的二进制解析器。

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 2011-10-14
      • 2012-11-16
      • 1970-01-01
      相关资源
      最近更新 更多