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
