小编典典

JSON 字符串中的二进制数据。比 Base64 更好的东西

all

JSON 格式本身不支持二进制数据。必须对二进制数据进行转义,以便可以将其放入 JSON
中的字符串元素(即使用反斜杠转义的双引号中的零个或多个 Unicode 字符)。

转义二进制数据的一个明显方法是使用 Base64。但是,Base64 的处理开销很高。此外,它将 3 个字节扩展为 4 个字符,这导致数据大小增加了约
33%。

一个用例是CDMI 云存储 API 规范的 v0.8
草案。您可以使用 JSON 通过 REST-Webservice 创建数据对象,例如

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream",
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}

是否有更好的方法和标准方法将二进制数据编码为 JSON 字符串?


阅读 225

收藏
2022-03-03

共1个答案

小编典典

根据 JSON 规范,有 94 个 Unicode 字符可以表示为一个字节(如果您的 JSON 以 UTF-8
传输)。考虑到这一点,我认为你可以在空间方面做的最好的事情是base85,它将四个字节表示为五个字符。但是,这仅比
base64 提高了 7%,计算成本更高,并且实现不如 base64 常见,因此它可能不是胜利。

您也可以简单地将每个输入字节映射到 U+0000-U+00FF 中的相应字符,然后执行 JSON
标准所需的最小编码来传递这些字符;这里的优点是,除了内置函数之外,所需的解码为零,但空间效率很差——扩展 105%(如果所有输入字节的可能性相同),而
base85 为 25%,base64 为 33%。

最终判决:在我看来,base64 获胜,因为它很常见,很容易,而且还 不足以 保证更换。

2022-03-03