python实现各进制转换的总结大全
前言
玩ctf经常遇到进制转换的问题,就正好做一个进制转换总结,分享出来供大家参考学习,下面来一起看看详细的介绍:
字符串与十六进制转换
例如百度ctf12月的第二场第一个misc
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
比较简单的一种做法就是直接调用字符串的.decode('hex')解密即可,但如果不用这个函数你会怎么解呢?
一种思路就是先2个分组,解出每组的ascii值,合并下字符串即可得到,具体代码如下
importre s='666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D' s=re.findall(r'.{2}',s) s=map(lambdax: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(lambdax:hex(int(x,2)),['0011'])//lambda表达式
或者是
[hex(int(x,2))forxin['0011']]//列表解析
对应的解密函数就是
map(lambdax:bin(int(x,16)),['ef'])
最后在附上自己用python写的一个进制转换小工具,主要功能是对一组二进制,或者ascii,或十六进制转换成字符串,想必ctf上也经常会遇到这类题型吧
#makeby江sir #coding:utf-8 importre importargparse defbintostr(text): text=text.replace('','') text=re.findall(r'.{8}',text) s=map(lambdax:chr(int(x,2)),text)#批量二进制转十进制 flag=''.join(s) returnflag defasciitostr(text): if''intext: text=text.split('') elif','intext: text=text.split(',') s=map(lambdax:chr(int(x)),text) flag=''.join(s) returnflag defhextostr(text): text=re.findall(r'.{2}',text) #printtext s=map(lambdax:chr(int(x,16)),text) #prints flag=''.join(s) returnflag if__name__=='__main__': parser=argparse.ArgumentParser() parser.add_argument("-b") parser.add_argument("-a") parser.add_argument("-x") argv=parser.parse_args() #printargv ifargv.b: res=bintostr(argv.b) elifargv.a: res=asciitostr(argv.a) elifargv.x: res=hextostr(argv.x) printres
用法:
十六进制转字符串:
666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D
bintostr.py-x"666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D" flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}
二进制转字符串:
可以有空格,也可以无空格
00101111011001100011011000110111001100110011001000110100001100010011000001100001011000010110010001100011001100000011001100110111011001100110001000110000011000110110001001100001011000010011000000110000011000110011011100110101001100110011000100110011001101110011001100101110011101000111100001110100
bintostr.py-b"00101111011001100011011000110111001100110011001000110100001100010011000001100001011000010110010001100011001100000011001100110111011001100110001000110000011000110110001001100001011000010011000000110000011000110011011100110101001100110011000100110011001101110011001100101110011101000111100001110100" /f6732410aadc037fb0cbaa00c7531373.txt
ascii转字符串
可以是空格分隔,也可以是,分隔
s='4546454632453246464546324645464632464646324546464632464645454645324546464632464646324645464632'
bintostr.py-a"4546454632453246464546324645464632464646324546464632464645454645324546464632464646324645464632" -.-.-..-..-.....-.....--.--.......-..
以上实例均来自某些ctf赛题
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。