本文转自:http://wiyi.org/binary-to-string.html

json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型。如果想要传输图片等二进制文件的话,是没办法直接传输。

本文提供一种思路给大家参考,让大家可以在json传输二进制文件,如果大家有这个需求又不知怎么实现的话,也许本文能够帮到你。思想适用于所有语言,本文以java实现,相信大家很容易就能转化为自己懂得语言。

思路

1. 读取二进制文件到内存

2. 用Gzip压缩一下。毕竟是在网络传输嘛,当然你也可以不压缩。

3. 用Base64 把byte[] 转成字符串

补充:什么是Base64

以下摘自阮一峰博客,Base64的具体编码方式,大家可以直接进入。

Base64是一种编码方式,它可以将8位的非英语字符转化为7位的ASCII字符。这样的初衷,是为了满足电子邮件中不能直接使用非ASCII码字符的规定,但是也有其他重要的意义:

a)所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑;

b)能够对文本进行简单的加密。

实现

主要思路就是以上3步,把字符串添加到json字段后发给服务端,然后服务器再用Base64解密–>Gzip解压,就能得到原始的二进制文件了。是不是很简单呢?说了不少,下面我们来看看具体的代码实现。

***注:Java SE是没办法直接用Base64的哦,必须要先自己去下载一份。但Android已经集成了Base64,因此大家可以直接在Android使用。

[java] view plaincopy
  1. /**
  2. * @author xing
  3. */
  4. public class TestBase64 {
  5. public static void main(String[] args) {
  6. byte[] data = compress(loadFile());
  7. String json = new String(Base64.encodeBase64(data));
  8. System.out.println("data length:" + json.length());
  9. }
  10. /**
  11. * 加载本地文件,并转换为byte数组
  12. * @return
  13. */
  14. public static byte[] loadFile() {
  15. File file = new File("d:/11.jpg");
  16. FileInputStream fis = null;
  17. ByteArrayOutputStream baos = null;
  18. byte[] data = null ;
  19. try {
  20. fis = new FileInputStream(file);
  21. baos = new ByteArrayOutputStream((int) file.length());
  22. byte[] buffer = new byte[1024];
  23. int len = -1;
  24. while ((len = fis.read(buffer)) != -1) {
  25. baos.write(buffer, 0, len);
  26. }
  27. data = baos.toByteArray() ;
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. } finally {
  31. try {
  32. if (fis != null) {
  33. fis.close();
  34. fis = null;
  35. }
  36. baos.close() ;
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. return data ;
  42. }
  43. /**
  44. * 对byte[]进行压缩
  45. *
  46. * @param 要压缩的数据
  47. * @return 压缩后的数据
  48. */
  49. public static byte[] compress(byte[] data) {
  50. System.out.println("before:" + data.length);
  51. GZIPOutputStream gzip = null ;
  52. ByteArrayOutputStream baos = null ;
  53. byte[] newData = null ;
  54. try {
  55. baos = new ByteArrayOutputStream() ;
  56. gzip = new GZIPOutputStream(baos);
  57. gzip.write(data);
  58. gzip.finish();
  59. gzip.flush();
  60. newData = baos.toByteArray() ;
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. } finally {
  64. try {
  65. gzip.close();
  66. baos.close() ;
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. System.out.println("after:" + newData.length);
  72. return newData ;
  73. }
  74. }

最后输出了一下字符串长度,大家也许觉得经过压缩也没降低多少体积嘛。但大家可以试试不用gzip,你会发现经过转换的字符串比原来大多了。没办法,这是由Base64的算法决定的。所以嘛,还是压缩一下好。

本文所使用的方法比较简单,大家如果有更好或者觉得有更好的方式,不妨一起探讨一下。

最后顺便吐槽一下Java,竟然写了这么多行代码。要是用Python,估计没几行就能搞定了。

转载于:https://www.cnblogs.com/mazhenyu/p/9228378.html

json传输二进制的方案【转】相关推荐

  1. json传输二进制的方案(python版)

    json传输二进制的方案(python版) 1.json不能直接传二进制文件 json只能传递基本的数型(如:int,long,string等),但不能传递byte类型.但是有时候我们想在json中传 ...

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

    UTF-8的问题在于它不是最节省空间的编码 . 此外,一些随机二进制字节序列是无效的UTF-8编码 . 因此,您不能将随机二进制字节序列解释为某些UTF-8数据,因为它将是无效的UTF-8编码 . 这 ...

  3. 浅析云控平台画面传输的视频流方案

    简介: 本文将小结本次云控平台画面传输的视频流方案. 背景 ARC(高德车机云控平台)是一个基于车载设备业务深度定制的云控平台,通过该平台我们能够实现远程使用不同类型的车载设备.为了让远程使用者像在本 ...

  4. HTTP传输二进制初探

    [转]HTTP传输二进制初探 http://www.51testing.com/?uid-390472-action-viewspace-itemid-233993 [转]HTTP传输二进制初探 上一 ...

  5. c++传输二进制数据

    文章目录 一.前提 二.二进制和指针相关概念 1.二进制数据传输的本质 2.指针相关概念 (1)float* 和char*类型的指针有什么区别吗 (2)c语言关于指针和长度的理解 3.二进制传输步骤 ...

  6. Python csv、xlsx、json、二进制(MP3) 文件读写基本使用

    Python csv.xlsx.json.二进制(MP3) 文件读写基本使用 文章目录 Python csv.xlsx.json.二进制(MP3) 文件读写基本使用 前言 一.什么是文件读写? 二.文 ...

  7. 5G移动网络的光传输解決方案

    5G移动网络的光传输解決方案 ​ 1. 5G 是什么? 第五代移动电话行动通信标准,也称第五代移动通信技术,英文缩写:5G.按照3GPP组织的时间表,R14标准主要开展5G系统框架和关键技术研究:R1 ...

  8. Shell 十六进制转换成二进制的方案

    十六进制转换成二进制的方案 代码如下: #/bin/bash Hex2Bin(){     local string=$1     if [[ -z $string ]]; then          ...

  9. 网络安全之ENC1应用内/外网音视频传输完全隔离方案

    网络安全之ENC1应用内/外网音视频传输完全隔离方案 大家好,又见面了,前两天某客户买了ENC1两台,在支持的过程中,居然发现原来还能这样用,看来ENC1不火都不行啊. 随着计算机技术的飞速发展,信息 ...

最新文章

  1. 如何挑选一家好的软件测试培训机构
  2. 3w字带你揭开WebSocket的神秘面纱~
  3. 在JavaScript中删除对象
  4. STM32应用实例六:与MS5837压力传感器的I2C通讯
  5. 程序员的基本功:为什么非要用 Python 做数据分析?Excel 不好吗?
  6. RegisterWindowMessage
  7. laravel项目拉下来之后,项目整个的启动
  8. Android之AIDL跨进程通讯
  9. 【C语言作业】一个数如果恰好等于它的因子之和,这个数就称为完整数。例如6的因子为1、2、3,而6=1+2+3,因此6是完数,编程找出1000之内的所有完整数
  10. OpenJudge 河中跳房子
  11. 程序员进 ICU 昏迷五六天,恢复后决定辞职回乡改行送菜
  12. 保你学会Springboot如何前后端分离地传输数据!(后端,前端的坑过几天填上)
  13. Security and Communication Networks 论文投稿
  14. 如何用本地连接共享无线网络连接
  15. 微信小程序简单获取当前时间及日期
  16. Android Notification详解【郭霖公众号推荐】
  17. android微信小程序自动填表_微信“填表”类小程序,你可能根本没用对
  18. 正则表达式不区分大小写以及解决思路的探索
  19. VB语音对接验证码短信接口DEMO示例
  20. 软考系统分析师倒计时第10天

热门文章

  1. 在51单片机上使用递归的注意事项
  2. 简单的python流回显服务器与客户端
  3. [ECMAScript] 说说你对set数据结构的理解
  4. 前端小知识点(6):听了好多闭包,这次可能最懂
  5. 前端学习(3327):闭包的形式2
  6. 前端学习(3326):闭包的形式1
  7. 前端学习(3093):vue+element今日头条管理-反馈
  8. 前端学习(2972):使用mock假数据
  9. 前端学习(2944):前一天回顾
  10. [html] 使用history路由方式时,你有自己动手配置过服务器端吗?为什么要配服务器端?怎么配?