python说明编码和解解码

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)

  

posted @ 2020-06-03 16:49  安迪9468  阅读(249)  评论(0编辑  收藏  举报