如何解决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 字符串?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。