对可能是二进制但通常是文本的数据进行有效的 JSON 编码

Posted

技术标签:

【中文标题】对可能是二进制但通常是文本的数据进行有效的 JSON 编码【英文标题】:Efficient JSON encoding for data that may be binary, but is often text 【发布时间】:2010-04-14 00:30:18 【问题描述】:

我需要通过网络发送一个 JSON 数据包,其中包含任意文件的内容。这可能是二进制文件(如 ZIP 文件),但通常是纯 ASCII 文本。

我目前正在使用 base64 编码,它处理所有文件,但它显着增加了数据的大小 - 即使文件以 ASCII 开头。除了手动检查任何非 ASCII 字符然后决定是否对它进行 base64 编码之外,有没有更有效的方法可以对数据进行编码?

我目前正在使用 Python 编写此代码,但可能需要在 Java、C# 和 C++ 中执行相同的操作,因此更可取的是易于移植的解决方案。

【问题讨论】:

【参考方案1】:

使用带引号的可打印编码。任何语言都应该支持这一点。 http://en.wikipedia.org/wiki/Quoted-printable

【讨论】:

有趣的想法,谢谢。 QP 对文本数据的开销肯定更少,但对二进制数据的开销更大,所以我不太确定。 +1,无论如何。 Quoted-printable 适用于偶尔使用二进制的文本,但对于二进制文件,它的大小确实会膨胀。在这种情况下,Base-64 应该更有效。我会尽量避免通过 JSON 传递文件,而是将 URL 传递给它,并让另一端的软件在解码 JSON 结构后将 URL 作为辅助进程检索。 您可以做的另一件事(如果 Greg 建议失败,例如出于网络拓扑原因)是使用 QP 或 Base64,并在开头放一个字符让对方知道哪个它是。这在编码器和解码器上当然很容易......

以上是关于对可能是二进制但通常是文本的数据进行有效的 JSON 编码的主要内容,如果未能解决你的问题,请参考以下文章

adodb.stream的说明

文本文件与二进制文件

数据的加密与签名

Python3 对文件操作

深度因式分解机

json是啥编码