关于python如何实现各进制转换的总结大全

Python014

关于python如何实现各进制转换的总结大全,第1张

ctf经常遇到进制转换的问题,就正好做一个进制转换总结,分享出来供大家参考学习,下面来一起看看详细的介绍:

字符串与十六进制转换

例如百度ctf 12月的第二场第一个misc

?

1

666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D

比较简单的一种做法就是直接调用字符串的.decode('hex')解密即可, 但如果不用这个函数你会怎么解呢?

一种思路就是先2个分组,解出每组的ascii值,合并下字符串即可得到,具体代码如下

?

1234567

import res='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函数

?

1

int(str,base) //返回十进制整数,但注意此时第一个参数为字符串

对应的解密函数分别是

?

12345

bin() //10进制转二进制 oct() //十进制转八进制 hex() //十进制转十六进制

但二进制直接转16进制就需要多走一步了,先用int转十进制,在用上面提到的hex()函数将十进制转换成十六进制,比较精简的写法是

?

1

map(lambda x:hex(int(x,2)),['0011']) //lambda表达式

或者是

?

1

[hex(int(x,2)) for x in ['0011']] //列表解析

对应的解密函数就是

?

1

map(lambda x:bin(int(x,16)),['ef'])

最后在附上自己用python写的一个进制转换小工具,主要功能是对一组二进制,或者ascii,或十六进制转换成字符串,想必ctf上也经常会遇到这类题型吧

?

1234567891011121314151617181920212223242526272829303132333435363738394041424344

# make by 江sir#coding:utf-8import reimport 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 flagif __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

用法:

十六进制转字符串:

666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D

?

12

bintostr.py -x "666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D"flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}

二进制转字符串:

可以有空格,也可以无空格

00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100

?

12

bintostr.py -b "00101111 01100110 00110110 00110111 00110011 00110010 00110100 00110001 00110000 01100001 01100001 01100100 01100011 00110000 00110011 00110111 01100110 01100010 00110000 01100011 01100010 01100001 01100001 00110000 00110000 01100011 00110111 00110101 00110011 00110001 00110011 00110111 00110011 00101110 01110100 01111000 01110100"/f6732410aadc037fb0cbaa00c7531373.txt

ascii转字符串

可以是空格分隔,也可以是,分隔

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 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32'

?

12

bintostr.py -a "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 32 46 46 45 45 46 45 32 45 46 46 46 32 46 46 46 32 46 45 46 46 32"-.-. - ..-. .-.. ... -... ..--.- -... ... .-..

以上实例均来自某些ctf赛题

总结

python语言可以表示二进制、八进制、十进制和十六进制。表示进制的数,必须以0开头,然后分别跟着表示不同进制的字母。 二进制的字母是b,八进制的字母是o,十六进制的字母是x 。默认为十进制。

二进制:0b110011

八进制:0o56432

十六进制:0xF764A

int('11011',2) # 返回一个数值类型,表示转换后的十进制数

bin() 其他进制(十、八、十六进制)转为二进制

oct()其他进制(二、十、十六进制)转为八进制

hex()其他进制(二、八、十进制)转为十六进制

输出结果

python中的进制转换和原码,反码,补码

计算机文件大小单位

b = bit 位(比特)

B = Byte 字节

1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

1PB = 1024TB

1EB = 1024PB

进制分类

二进制:由2个数字组成,有0 和 1 python中标志:0b

八进制:由8个数字组成,有0,1,2,3,4,5,6,7 python中标志:0o

十进制:有10个数字组成,有0,1,2,3,4,5,6,7,8,9 python中标志:无

十六进制:有16个数字组成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(进制字母大小写都可以,分别代表10,11,12,13,14,15) python中标志:0x

python中的进制转换:

其他进制转换为十进制:int(相应进制)

其他进制转换为二进制:bin(相应进制)

其他进制转换为八进制:oct(相应进制)

其他进制转换为十六进制:hex(相应进制)

二进制 转化成 十进制:

例: 0b10100101

运算:1* 2^0 + 0* 2^1 + 1* 2^2 + 0* 2^3 + 0* 2^4 + 1* 2^5 + 0* 2^6 + 1* 2^7=

1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165

八进制 转化成 十进制:

例: 0o127

运算:7*8^0 + 2*8^1 + 1*8^2 = 7+16+64 = 87

十六进制 转化成 十进制:

例: 0xff

运算:15*16^0 + 15*16^1 = 255

十进制 转化成 二进制:

426 =>0b110101010

运算过程: 用426除以2,得出的结果再去不停地除以2,

直到除完最后的结果小于2停止,

在把每个阶段求得的余数从下到上依次拼接完毕即可

十进制 转化成 八进制:   

426 =>0o652

运算过程: 用426除以8,得出的结果再去不停地除以8,

直到除完最后的结果小于8停止,

在把每个阶段求得的余数从下到上依次拼接完毕即可

十进制 转化成 十六进制:   

运算过程: 用426除以16,得出的结果再去不停地除以16,

直到除完最后的结果小于16停止,

在把每个阶段求得的余数从下到上依次拼接完毕即可。

相关推荐:《Python视频教程》

原码,反码,补码

实际人们看到的数字是原码转化之后显示出来的。

而原码是通过补码得到的。

计算机的所有数据在底层都是以二进制的补码形式存储。

***进制转换的时候需要先把内存存储的补码拿出来变成原码在进行转换输出***

反码:二进制码0变1,1变0叫做反码,反码用于原码补码之间的转换。

补码:用来做数据的存储运算,可以实现计算机底层的减法操作,因而提出(可以表达出一个数的正负)。

也就是说默认计算机只会做加法,例:5+(-3) =>5 - 3。

乘法除法是通过左移和右移 <<>>来实现。

正数高位补0,负数高位补1。

正数:

原码 = 反码 = 补码

负数:

反码 = 原码取反(除高位)

补码 = 反码加1

反码 = 补码减1

原码 = 反码取反(除高位)

我们会发现,在取反前减1和在取反后加1的效果是一样的,这就和-2-1 = -(2+1)一个道理,所以会得出这样的规律:

原码 = 补码取反加1

补码 = 原码取反加1

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 叫符号位正数为0, 负数为1。

比如

正数1在计算机中的存储即为

0 00000000000000000000001

负数1 在计算机中的存储即为

1 00000000000000000000001

一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。

正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反。

正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1。

所以原码,反码,补码正数情况下是一致的,负数情况下是不一致的。

计算机的运算过程实际就是补码相加的一个过程。

比如-2 + 3

-2 的原码为

1 000000000000000000000000010

反码为:

1 111111111111111111111111101

补码为:

1 111111111111111111111111110

3的原码为

0 000000000000000000000000011

反码为:

0 000000000000000000000000011

补码为:

0 000000000000000000000000011

那么二者补码相加结果为

1 111111111111111111111111110

+

0 000000000000000000000000011

=

10 000000000000000000000000001(计算机存储为32位,故前面溢出的1被舍弃,高位为0)

0 000000000000000000000000001

结果为1

再比如-2 + 1

-2 的原码为

1 000000000000000000000000010

反码为:

1 111111111111111111111111101

补码为:

1 111111111111111111111111110

1的原码为

0 000000000000000000000000001

1的反码为:

0 000000000000000000000000001

1的补码为:

0 000000000000000000000000001

二者的补码相加结果为

1 111111111111111111111111110

+

0 000000000000000000000000001

=

1 111111111111111111111111111

得出的补码转化为原码, 最低位减一得到反码,然后除符号位外所有位取反,得到结果

1 000000000000000000000000001

结果为1