Skip to content

Latest commit

 

History

History
65 lines (50 loc) · 3.05 KB

File metadata and controls

65 lines (50 loc) · 3.05 KB

python3中关于字节,字符串,进制,编码之间的总结区分

最近学习ctf中的密码学会经常用到python但是对python中的进制转换,什么时候要用字节形式,什么时候要用到字符串形式以及进制和各种编码混在一起,这些分不太清楚做题时很浪费时间,所以来总结区分一下...

首先对于字节和字符串,两者形式上的区别在于字节形式上会有一个b,类似于下面

在这里插入图片描述 两者也可以进行转换,如下图

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之后字节与字符串以及各种编码之间已经划分的非常明确,如果对这些转换不是很明确在学习中会很浪费时间,所以再次解决这些困惑还是很有帮助的。

参考文章1