标题说明了一切。基本上我使用 TCP 进行客户端-服务器设置,我想知道在通过 tcp 发送数据之前将字符串转换为二进制是否有优势?
3 回答
字符串是二进制数据,或者至少可以很容易地转换成这样的,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;
}
如果您压缩/编码您发送的数据,无论它是作为字符串还是二进制数据开始,您很可能会发送相同的总字节数。
在绝大多数情况下没有真正的优势。此外,二进制数据往往更依赖于平台,因此如果您想将客户端/服务器扩展到多平台环境,您最好还是坚持使用字符串。
有些数据以二进制编码,例如DER。
如果您的应用程序需要发送这些类型的数据,您可以直接发送二进制文件。例如CA 的证书。如果您将其作为base64之类的字符串发送,则需要更大的大小来表示它。
在某些较低级别,如 TCP,由于大小、性能和容错性,两个实体之间共享信息(握手)使用二进制。
但是作为一个需要敏捷发展的应用程序开发人员,除了大小之外,还有很多事情需要考虑,比如兼容性和维护。假设您需要用二进制数据响应一些元数据,您可能需要使用 JSON 来表示:
{
"version": 1,
"data": "base64 encoded data"
}
对客户来说事情会变得更容易,因为有大量工具可以帮助解析 JSON,并且当您无需工具即可查看数据(人类可读)时,调试起来会更容易。另一方面,二进制编码(如 DER)你必须升级你的协议文档,让客户可以轻松地将他们的代码升级为新格式,你还需要考虑向后/向前兼容。
虽然有一些工具可以帮助二进制编码更加兼容和可维护,例如Apache Thrift、Protocol Buffer、Apache Avro。
深入研究性能方面。除非您正在比较有无编码/解码过程(这很容易比较哪个更好)。你必须做一些负载测试来检查它。
例如,有一些速度极快的 JSON 解析器,它可以轻松击败一些声称性能比其他解析器更好的二进制解析器。