python binascii 进制转换实例
记录这个是因为在做
2020BJDCTF 中
Crypto 类型里有关16进制转换的一道题,python脚本里面用到了binascii进制转换。
import binascii x=0x424A447B4469664D616E63686573746572636F64657D x=binascii.unhexlify(hex(x)[2:]) print(x)
关于二进制转换
binascii.b2a_hex(data)和binascii.hexlify(data):返回二进制数据的十六进制表示。每个字节被转换成相应的2位十六进制表示形式。因此,得到的字符串是是原数据长度的两倍。
binascii.a2b_hex(hexstr) 和binascii.unhexlify(hexstr):从十六进制字符串hexstr返回二进制数据。是b2a_hex的逆向操作。 hexstr必须包含偶数个十六进制数字(可以是大写或小写),否则报TypeError。
举个栗子~
#coding: utf-8 import binascii a = 'worker' b = binascii.b2a_hex(a.encode()) #有些写法是这样的:b = binascii.b2a_hex(a),这样运行会报错,报错原因见文章末尾 print("b2a_hex",b) c = binascii.hexlify(a.encode()) print("hexlify",c) d = binascii.a2b_hex(b.decode()) print("a2b_hex",d) e = binascii.unhexlify(b.decode()) print("unhexlify",e)
b2a_hex 与
hexlify 功能一致;
a2b_hex 与
unhexlify 一致。
b2a_hex 与
a2b_hex 相反;
hexlify 与
unhexlify 相反。
运行结果:
有兴趣的话,也可以研究一下
base64 的编码
Base64编码 :
binascii.a2b_base64(string):转换的base64数据块为二进制,并返回二进制数据。一次可以传递多行。和base64. b64decode对应。
binascii.b2a_base64(data):转换二进制数据为一行base64编码的ASCII字符。返回字符串包含换行符。根据base64的标准data的长度最大为57。和base64. b64encode对应。
关于 binascii.b2a_hex(a) 报错的问题:
使用binascii方法一直出现报错
TypeError: a bytes-like object is required, not 'str'
#coding: utf-8 import binascii a = 'worker' b = binascii.b2a_hex(a) print(b) #b = binascii.b2a_hex(a) #TypeError: a bytes-like object is required, not 'str'
解决方法:
后来修改如下代码才会不报错
b = binascii.b2a_hex(a.encode())
原理:
在新版本的 python3 中,取消了 unicode 类型,代替它的是使用 unicode 字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型(bytes)但是两个函数的使用方法不变:
decode encode
bytes ------> str(unicode)------>bytes
u = '中文' #指定字符串类型对象u str = u.encode('gb2312') #以gb2312编码对u进行编码,获得bytes类型对象str u1 = str.decode('gb2312')#以gb2312编码对字符串str进行解码,获得字符串类型对象u1 u2 = str.decode('utf-8')#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的字符串内容
参考资料
https://www.cnblogs.com/yinsjun/p/6951588.html
https://www.cnblogs.com/hushaojun/p/7552138.html