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个字节表示一个符号的情况都有。
常见编码参考:https://www.cnblogs.com/andy9468/p/7465489.html
base64编码表
对二进制数据序列,如01010.....11000,每3个字节分成4组(1组6个bit位,共24个bit位,不足后面补0),再按照base64码表进行编码,不足3个字节的补上=等号。
base64详细编码参考:https://www.cnblogs.com/qi-yuan-008/p/12940018.html
编码表举例:ASCII表、base64表:https://www.cnblogs.com/andy9468/p/13039201.html
延伸:
键盘输入到屏幕显示,背后的数字转换。
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
虚拟键键码参考:https://blog.csdn.net/sunlylorn/article/details/6456269
(二)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)