json传输二进制的方案(python版)
1.json不能直接传二进制文件
json只能传递基本的数型(如:int,long,string等),但不能传递byte类型。但是有时候我们想在json中传送一些二进制文件,如:图片等,是没办法直接传输。
再给出解决方案前补充一下编码和解码的知识:
- 编码:将信息从一种形式或格式转换为另一种形式的过程,如:(生活中的字符串转计算机的存储字节,一种不可字符化的字节转另一用可字符化的字节)
- 解码:编码的逆向形式。
2.思路
- 我们要通过一些办法将二进制文件转成字符串供给json传输,然后在服务端再将字符串转为二进制文件。
- 但是二进制文件无法直接转化为可打印的字符串(因为编码方式不允许),这时我们需要对二进制文件做一个转化,将文件的二进制序列转化为一种能被转为字符串的二进制序列,然后再转化为字符串。
- 文件(不可直接转字符串)----->编码后的二进制序列(可字符串化)----->字符串----->json传输
思路步骤如下:
- 读取二进制文件(A)
- 使用base64编码文件的二进制序列(A),编码后的二进制序列(B)转化为可打印的文本编码
- 将编码后的二进制序列(B)转化为字符串
- 使用json传输经过转换后的字符串
- 在服务端将字符串重新转化为二进制序列(B)
- 然后再通过base64解码成原二进制序列(A)
3.base64
base64有以下这些作用
a)所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑;
b)能够对文本进行简单的加密。
操作步骤如下:
base64编码
with open(imgname, 'rb') as img:
#读取二进制序列
data = img.read()
#b64编码,生成新的可字符化的二进制序列
bast64_data = base64.b64encode(data)
#字符串化,使用utf-8的方式解析二进制
bast64_str = str(bast64_e,'utf-8')
#json传递
......
base64解码
#将字符串重新编码为utf-8的二进制序列(该序列被b64编码过)
bast64_data = bast64_str.encode(encoding='utf-8')
#b64解码,获得原二进制序列
data = base64.b64decode(bast64_data)