UTF-8的问题在于它不是最节省空间的编码 . 此外,一些随机二进制字节序列是无效的UTF-8编码 . 因此,您不能将随机二进制字节序列解释为某些UTF-8数据,因为它将是无效的UTF-8编码 . 这种对UTF-8编码的约束的好处在于它使得它很可靠并且可以定位多字节字符开始和结束我们开始查看的任何字节 .

因此,如果在[0..127]范围内编码字节值只需要UTF-8编码中的一个字节,则编码[128..255]范围内的字节值将需要2个字节!比那更糟糕 . 在JSON中,控制字符“和\”不允许出现在字符串中 . 因此二进制数据需要进行一些转换才能正确编码 .

让我们看看 . 如果我们在二进制数据中假设均匀分布的随机字节值,那么平均来说,一半字节将在一个字节中编码,另一半在两个字节中编码 . UTF-8编码的二进制数据将具有初始大小的150% .

Base64编码仅增长到初始大小的133% . 所以Base64编码效率更高 .

那么使用其他Base编码呢?在UTF-8中,对128个ASCII值进行编码是最节省空间的 . 在8位中,您可以存储7位 . 因此,如果我们以7位块的形式剪切二进制数据以将它们存储在UTF-8编码字符串的每个字节中,则编码数据将仅增长到初始大小的114% . 比Base64好 . 不幸的是,我们不能使用这个简单的技巧,因为JSON不允许一些ASCII字符 . ASCII([0..31]和127)的33个控制字符和“和\”必须被排除 . 这使得我们只有128-35 = 93个字符 .

因此理论上我们可以定义一个Base93编码,它将编码大小增加到8 / log2(93)= 8 * log10(2)/ log10(93)= 122% . 但Base93编码不如Base64编码方便 . Base64需要以6位块的形式剪切输入字节序列,以便简单的按位运算 . 除133%外,不超过122% .

这就是我独立得出的结论,即Base64确实是用JSON编码二进制数据的最佳选择 . 我的回答是一个为它辩护 . 我同意从性能的角度来看它并不是很有吸引力,但也要考虑使用JSON的好处,它的人类可读字符串表示易于在所有编程语言中操作 .

如果性能至关重要,则应将纯二进制编码视为JSON的替代 . 但是对于JSON,我的结论是Base64是最好的 .

java json转二进制数据_JSON字符串中的二进制数据 . 比Base64更好的东西相关推荐

  1. json 大括号 综括号_JSON 字符串中的中括号和大括号区别详解

    json 变量有两种可能, 可能是一个对象, (类似 类的实例), 也可能是一个数组!! 主要是要 从 ""语义" 上来分析, 到底该用 大括号还是用中括号: 如果从语义 ...

  2. 已解决Python向数据库插入数据的字符串中含有单引号或双引号报错

    已解决Python向数据库插入数据的字符串中含有单引号或双引号报错:(102, b"Incorrect syntax near 'S'.DB-Lib error message 20018, ...

  3. android字符串获取数字索引,从字符串中提取特定数据(Extract specific data from a string)...

    从字符串中提取特定数据(Extract specific data from a string) 我有一个带有描述的长字符串. 我想从字符串中提取一些信息. 但我无法弄明白该怎么做. 这是字符串: C ...

  4. c语言如何读出字符串中的数据,如何把数据存在字符串中

    怎么把数据存在字符串中? 最近写单片机一个控制程序  遇到了瓶颈,请大神指点,问题如下: 8路AD采集采集 采集到的数据存在measurement[i] 中 利用采集的数据来发送串口指令实施控制,指令 ...

  5. json 大括号 转意_json字符串中的大括号转义传到后台_JSON 序列化中的转义和 Unicode 编码...

    本文比较完整地整理一下 JSON 编码中的转义,以及 JSON 对 Unicode 编码的处理. 其实这是我上一篇文章的姊妹篇.在研究 Unicode 颜文字的时候,由于我们的数据传输是通过 JSON ...

  6. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

  7. java struts2 ajax_在struts2的Action中返回Ajax数据

    author:z_xiaofei168 如何在struts2的action中返回数据(普通字符串.图片)给ajax核心中的XMLHttpRequest对象. 今天下午做项目,就是用户注册是时候,登录名 ...

  8. 使用基于JSON的实体在C#中缓存远程数据

    从GitHub下载最新消息 介绍 除了查询基于JSON / REST的远程服务的简洁方法之外,您通常还需要一种方法来缓存和索引您获取的数据.这对于Web服务尤为重要,因为它们的性质,以及连接服务的延迟 ...

  9. java json传值到前台_json前后台传值

    谈到JSON,简单的说就是一种数据交换格式.近年来,其在服务器之间交换数据的应用越来越广,相比XML其格式更简单.编解码更容易.扩展性更好,所以深受开发人员的喜爱. 下面简单的写一下在项目中前后台js ...

最新文章

  1. ASP.NET服务器端控件原理分析
  2. 面试之作用域链与闭包
  3. 数据库视频(二)——增删改查
  4. JS正则表达式验证数字非常全 - 吾心无所 - 博客园
  5. web app小程序各种客服窗口插件
  6. NIS 报错No such map passwd.byname. Reason: Can't bind to server which serves this domain
  7. html文本框部分字体变颜色,实现文本框内,部分字体颜色、字号等自定义
  8. 推荐几本 Go 语言电子书
  9. 为了在 Windows 11 上启用 IE ,我撸了个修复工具
  10. hadoop部分架构图
  11. 纯CSS代码绘制小米LOGO
  12. Rosalind第16题——ros_bio16_MPRT
  13. windows10如何注销
  14. java用下划线分开字母和数字_数字文字中的Java 7下划线
  15. AIMD吞吐量公式的推导
  16. [导入]polygraph3d三维运行时引擎为silverlight 1.0.zip(15.69 KB)
  17. SpringBoot+websocket实现私聊和群聊(可以发送文字和图片)
  18. 黑马程序员还收费 兄弟会都是免费的
  19. 2020-11-21
  20. java代码实现二叉树的遍历

热门文章

  1. loadrunner11安装,提示少了Microsoft Visual c++2005 sp1运行时组件解决办法
  2. 诚邀参加微软.NET俱乐部10月24日Windows 7社区发布会
  3. 静态链接库与动态链接库的区别
  4. 尘埃落定,初心未改——一个大学生的电子大赛感悟
  5. Modbus协议概念最详细介绍
  6. C语言、嵌入式中几个非常实用的宏技巧
  7. 51单片机——硬件基础
  8. CPropertySheet 与CPropertyPage 的基本使用
  9. 手机java软件_浅谈软件开发就业前景
  10. 【Pytorch神经网络理论篇】 26 基于空间域的图卷积GCNs(ConvGNNs):定点域+谱域+图卷积的操作步骤