python说明编码和解解码

(一)术语

编码:把人类易读符号转为计算机易读的二进制的操作。

如,按照ASCII码表,将a转为二进制0110 0001 (十进制:97。16进制:\x61)。

按照base64码表,将a转为二进制01 1010 (十进制:26)。

解码:把计算机易读的二进制转为人类易读符号的操作。

如,按照ASCII码表,将0110 0001 转成符号为 a。

按照base64码表,将01 1010 转成符号为 a。

编码表:编码和解码之间的正确映射关系,成为编码表。编码表包括字符集(即符号)、数字代码(即序号)。

ASCII码表:

美国符号表。

GB系列码表:

中国符号表,兼容美国符号。

JP系列码表:

日本符号表,兼容美国符号。

UTF系列码表:

万国码符号表,兼容地球所有符号。

ASCII码表规则特点:

容纳了美国的符号。

1个字节(8个bit位)表示一个符号,最大0111 1111 (0-127),最多表示128个符号(打印+非打印符号)

GB系列码表规则特点:

容纳了中国符号、美国符号。

1-2个字节表示一个符号。

当1个字节(8个bit位)的最高位为0时,1个字节表示一个符号。此规则是在兼容ASCII码表。

当1个字节(8个bit位)的最高位为1时,2个这样的字节表示一个符号。此规则用于表示汉字(中国的符号)。

UTF系列码表规则特点:

容纳了全世界的所有符号。

utf-32,4个字节(32个bit位)表示一个符号。

utf-16,2个字节(16个bit位)表示一个符号。

utf-8,可变字节。1、2、3个字节表示一个符号的情况都有。

常见编码参考:

base64编码表

对二进制数据序列,如01010.....11000,每3个字节分成4组(1组6个bit位,共24个bit位,不足后面补0),再按照base64码表进行编码,不足3个字节的补上=等号。

base64详细编码参考:

延伸:

键盘输入到屏幕显示,背后的数字转换。

A键 => 30 => 65 => 97 => a

A键:压下A键,对应一次mark。mark的理解:http://blog.sina.com.cn/s/blog_1511e79950102x2b0.html

30:键盘扫描码为30

65:键盘驱动程序软件识别30对应虚拟键码为65(A)

97:键盘驱动程序软件没有识别到shift压下的事件,将虚拟键标记为ASCII码的字符‘a’(即为97)

详细击键过程:https://www.iteye.com/blog/hu-jiacheng-1508028

虚拟键键码参考:

(二)python说明代码

# 1、转成2进制
# (1)字符编码为二进制流
print("(1)字符编码为二进制流")
str1 = ‘SE‘
str1_bytes = str1.encode(‘utf-8‘) # 按utf-8编码,返回二进制流
print(type(str1_bytes))
print(str1_bytes)
# (2)查看二进制字符串
print("(2)查看二进制字符串")
# 遍历单个字符的字节流。注意,从字节流中取出一个元素就是一个字节(8个bit位),该元素的类型是int。
for one_byte in str1_bytes:
# print(type(one_byte))
binary_str = bin(one_byte) # 将一个整数(值在0-255之间)转为二进制字串表示。
# print(type(binary_str))
print(binary_str)
# (3)从文件中读取二进制
print("(3)从文件中读取二进制")
pic = "55.png"
with open(pic, ‘rb‘) as f:
pic_content = f.read()
print(type(pic_content))
print(pic_content)
pass
# (4) 转成二进制字串
# 内置函数bin、oct、hex实现10进制转换2、8、16进制
print("(4) 转成二进制字串:(10进制的)3转二进制‘0b11‘")
binary_str = bin(3) # (10进制的)3转二进制‘0b11‘
print(binary_str)
# 2、转成8进制
# oct(9) # (10进制的)9转8进制‘0o11‘
print("(10进制的)9转8进制‘0o11‘")
binary_str = oct(9) # (10进制的)3转8进制‘0o11‘
print(binary_str)
# 3、转成16进制
# (10进制的)17转二进制‘0x11‘
print("(10进制的)17转16进制‘0x11‘")
binary_str = hex(17) # (10进制的)3转16进制‘0x11‘
print(binary_str)
# 4、转成字节流
# str1.encode()
# 5、转成字符串
# bin1.decode()
# 6、将图片二进制按照base64编码
import base64
print(‘将图片二进制按照base64编码‘)
pic = "55.png"
with open(pic, ‘rb‘) as f:
pic_content = f.read() # 读取图片文件的二进制数据
print(type(pic_content))
print(pic_content) # 图片原始二进制
# 将图片二进制按照base64编码。最终是以ASCII码的二进制存储数据。逆向时,先用按照ASCII码表转为符号,再拿着符号按照base64码表转为二进制。
base64_data = base64.b64encode(pic_content)
print(base64_data) # 图片按照base64转码后的二进制。
# 将二进制按照utf-8(兼容了ASCII码表)转为字符串。
s = base64_data.decode()
print(‘data:image/png;base64,%s‘ % s)
pass
# 7、按utf-8编码和解码
print("按utf-8编码和解码")
str1 = ‘SE‘
str1_bytes = str1.encode(‘utf-8‘) # 按utf-8编码
print(str1)
print(str1_bytes)
# print(str1_bytes.decode(‘utf-8‘)) # 按utf-8解码
# 遍历单个字符的字节流。注意,从字节流中取出一个元素就是一个字节(8个bit位),该元素的类型是int。
for one_byte in str1_bytes:
# print(type(one_byte))
binary_str = bin(one_byte)
# print(type(binary_str))
print(binary_str)