python3中关于字节,字符串,进制,编码之间的总结区分
最近学习ctf中的密码学会经常用到python但是对python中的进制转换,什么时候要用字节形式,什么时候要用到字符串形式以及进制和各种编码混在一起,这些分不太清楚做题时很浪费时间,所以来总结区分一下…
首先对于字节和字符串,两者形式上的区别在于字节形式上会有一个b,类似于下面
两者也可以进行转换,如下图
| str = "hello world!" byte = str.encode() str = byte.decode()
|
关于进制之间。
对于最基础的进制之间的转换,最常用的应当是python的几个内置函数,例如int() , hex() , bin() ,oct(),代码如下
| int(x,base) int('0xa',16) int('0b100',2) bin(10) hex(255) oct(10)
|
关于进制与字符串之间的转换
最常用的还是字符串十六进制的转换,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| def str_to_hex(s): return [hex(ord(c) for c in s] str = 'hello' ptint(str_to_hex(str)) print(str.encode().hex()) hexstr = '68656c6c6f' print(bytes.fromhex(hexstr))
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))
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') chr(97)
from Crypto.Util.number import long_to_bytes,bytes_to_long print(long_to_bytes(97))
|
小结
在python3之后字节与字符串以及各种编码之间已经划分的非常明确,如果对这些转换不是很明确在学习中会很浪费时间,所以再次解决这些困惑还是很有帮助的。
参考文章1