为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

当年话下 2019-06-13 19:19:08

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

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

转义二进制数据的一个明显方法是使用base 64。然而,base 64具有较高的处理开销。此外,它还将3个字节扩展为4个字符,从而使数据大小增加了大约33%。

这方面的一个用例是CDMI云存储API规范..您可以使用JSON通过REST-Webservice创建数据对象。

PUT /MyContainer/BinaryObject HTTP/1.1Host: cloud.example.comAccept: application/vnd.org.snia.cdmi.dataobject+jsonContent-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字符串?


查看完整描述

3 回答

?
阿波罗的战车

根据JSON规范,有94个Unicode字符可以表示为一个字节(如果您的JSON被传输为UTF-8)。考虑到这一点,我认为你在太空方面所能做的最好的事情就是基座85它将四个字节表示为五个字符。然而,这仅仅比base 64提高了7%,计算成本更高,而且实现比base 64更少,所以这可能不是一场胜利。

您还可以简单地将每个输入字节映射到U+0000-U+00FF中的相应字符,然后执行JSON标准所要求的最小编码以传递这些字符;这里的优点是,所需解码超出了内置函数,但空间效率很低-扩展105%(如果所有输入字节的可能性相等),对base 85或Base 64的扩展为25%或33%。

最终裁决:在我看来,基本64胜,理由是它是普通的,容易的,也不坏足够的以保证替换。

另见:基91


查看完整回答
反对 回复 2019-06-13
?
慕码人8056858

我遇到了同样的问题,并认为我应该分享一个解决方案:多部分/表格-数据。

通过发送包含多个部分的表单,您首先以字符串的形式发送json元数据,然后以原始二进制文件(图像、wav等)的形式分别发送由内容处置名字,姓名。

这里有个很好的补习关于如何在obj-c中这样做,下面是博客文章这说明了如何使用表单边界对字符串数据进行分区,并将其与二进制数据分离。

您真正需要做的唯一改变是在服务器端;您必须捕获您的元数据,它应该适当地引用POST‘ed二进制数据(通过使用内容处理边界)。

当然,这需要服务器端的额外工作,但是如果您要发送许多图像或大图像,这是值得的。如果你愿意的话,把它和gzip压缩结合起来。

IMHO发送Base 64编码的数据是一个黑客;RFC多部分/表单数据是针对这样的问题创建的:发送二进制数据与文本或元数据相结合。


查看完整回答
反对 回复 2019-06-13
?
萧十郎

BSON(二进制JSON)可能适用于您。http://en.wikipedia.org/wiki/BSON

编辑:FYI.NET库json.net支持读和写bson,如果您正在寻找一些C#服务器端的爱。


查看完整回答
反对 回复 2019-06-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信