最近学习ctf中的密码学会经常用到python但是对python中的进制转换,什么时候要用字节形式,什么时候要用到字符串形式以及进制和各种编码混在一起,这些分不太清楚做题时很浪费时间,所以来总结区分一下...
str = "hello world!"
byte = str.encode() #字符串转换为字节形式 >>b"hello world!"
str = byte.decode() #字节形式转换为字符串对于最基础的进制之间的转换,最常用的应当是python的几个内置函数,例如int() , hex() , bin() ,oct(),代码如下
int(x,base) #第一个参数为所给数字或者字符串,第二个参数为进制数
int('0xa',16) #将所给字符串按照十六进制形式转化为十进制 结果为10
int('0b100',2) #按二进制转换为十进制 ,结果为4
bin(10) #>>'0b1010'
hex(255) #>>'0xff'
oct(10) #>>将十进制转换为八进制 结果为 '012'最常用的还是字符串十六进制的转换,代码如下
def str_to_hex(s):
return [hex(ord(c) for c in s]
str = 'hello'
ptint(str_to_hex(str)) #>>['0x68', '0x65', '0x6c', '0x6c', '0x6f']
print(str.encode().hex()) #>>输出为'68656c6c6f'
hexstr = '68656c6c6f'
print(bytes.fromhex(hexstr)) #输出为b'hello'
def hex_to_str(s):
return ''.join([chr(i) for i in [int(b, 16) for b in s]])
def str_to_bin(s):
return ' '.join([bin(ord(c)) for c in s])
print(str_to_bin(str)) #>>'0b11010000b11001010b11011000b11011000b1101111'
def bin_to_str(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])最常用有关于ASCII转码的函数ord()chr()
ord('a') #输出为97 转ASCII码
chr(97) #输出为'a' ASCII转字符
#还可以用Crypto库
from Crypto.Util.number import long_to_bytes,bytes_to_long
print(long_to_bytes(97)) #输出为字节型 b'a' bytes_to_long同理
在python3之后字节与字符串以及各种编码之间已经划分的非常明确,如果对这些转换不是很明确在学习中会很浪费时间,所以再次解决这些困惑还是很有帮助的。
