Fork me on GitHub

python binascii 二进制转换实例【b2a_hex、a2b_hex、hexlify、unhexlify】

python binascii 进制转换实例

 
 
 
  记录这个是因为在做 2020BJDCTF 中 Crypto 类型里有关16进制转换的一道题,python脚本里面用到了binascii进制转换。
 
import binascii
x=0x424A447B4469664D616E63686573746572636F64657D
x=binascii.unhexlify(hex(x)[2:])
print(x)
  
  关于这道题 请戳这里:https://www.cnblogs.com/0yst3r-2046/p/14552276.html
 
 
 

 关于二进制转换 

 
  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
 
 
 
posted @ 2021-03-17 21:48  0yst3r  阅读(14156)  评论(0编辑  收藏  举报
返回顶部