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

问题描述

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

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

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

解决方法

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 字符串?

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...