這篇文章主要為大家總結了python實作各進位轉換的相關資料,其中包括字串與十六進位轉換、內建函數hex()與進制互轉等相關內容,需要的朋友可以參考借鑒,下面來一起看看吧。
前言
玩ctf常遇到進位轉換的問題,就剛好做一個進位轉換總結,分享出來供大家參考學習,下面來一起看看詳細的介紹:
字串與十六進位轉換
例如百度ctf 12月的第二場第一個misc
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
比較簡單的做法就是直接呼叫字串的.decode('hex')
解密即可, 但如果不用這個函數你會怎麼解呢?
一個想法就是先2個分組,解出每組的ascii值,合併下字串即可得到,具體程式碼如下
import re s='666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D' s = re.findall(r'.{2}',s) s = map(lambda x:chr(int(x,16)),s) print ''.join(s) >>> flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
前面說了字串的decode('hex')
函數,另外還有兩個轉16進位的函數,這裡都總結一下
內建函數hex()
只能轉換10進位整數為十六進制,不能轉字串
binascii函式庫的hexlify()和b2a_hex()
這兩個函數的功能是將字串轉換成十六進制,對應的解密函數分別為unhexlify( )
和a2b_hex()
#進位互轉
二進制,八進制,十六進位轉10進位比較簡單,直接呼叫
int函數
int(str,base) //返回十进制整数,但注意此时第一个参数为字符串
對應的解密函數分別是
bin() //10进制转二进制 oct() //十进制转八进制 hex() //十进制转十六进制
但二進制直接轉16進制就需要多走一步了,先用int轉十進制,在用上面提到的hex()
函數將十進制轉換成十六進位,比較精簡的寫法是
map(lambda x:hex(int(x,2)),['0011']) //lambda表达式
或是
[hex(int(x,2)) for x in ['0011']] //列表解析
對應的解密函數就是
map(lambda x:bin(int(x,16)),['ef'])
最後在附上自己用python寫的一個進制轉換小工具,主要功能是對一組二進制,或者ascii,或十六進制轉換成字串,想必ctf上也常會遇到這類題型吧
# make by 江sir #coding:utf-8 import re import argparse def bintostr(text): text = text.replace(' ','') text = re.findall(r'.{8}',text) s = map(lambda x:chr(int(x,2)),text) #批量二进制转十进制 flag = ''.join(s) return flag def asciitostr(text): if ' ' in text: text = text.split(' ') elif ',' in text: text = text.split(',') s = map(lambda x:chr(int(x)),text) flag = ''.join(s) return flag def hextostr(text): text = re.findall(r'.{2}',text) #print text s = map(lambda x:chr(int(x,16)),text) #print s flag = ''.join(s) return flag if name == 'main': parser = argparse.ArgumentParser() parser.add_argument("-b") parser.add_argument("-a") parser.add_argument("-x") argv = parser.parse_args() #print argv if argv.b: res = bintostr(argv.b) elif argv.a: res = asciitostr(argv.a) elif argv.x: res = hextostr(argv.x) print res
##用法:
##十六進位轉字串:
666C61677B65633862326565302D336165392D346332312D613031322D303861613566162D ##二進位轉字串:
可以有空格,也可以無空格
rrre
as#ii轉
,分隔s='45 46 45 46 32 45 32 46 46 45 46 32 46 45 46 46 32 46 46 46 32 45 46 46 46 46 46 32 46 46 46 32 46 45 46 46 32'bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D" flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
##總結
以上是關於python如何實現各進制轉換的總結大全的詳細內容。更多資訊請關注PHP中文網其他相關文章!