python学习笔记1

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

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

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

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

1
2
3
4
str = "hello world!"
byte = str.encode() #字符串转换为字节形式 >>b"hello world!"
str = byte.decode() #字节形式转换为字符串

关于进制之间。

对于最基础的进制之间的转换,最常用的应当是python的几个内置函数,例如int() , hex() , bin() ,oct(),代码如下

1
2
3
4
5
6
int(x,base)     #第一个参数为所给数字或者字符串,第二个参数为进制数
int('0xa',16) #将所给字符串按照十六进制形式转化为十进制 结果为10
int('0b100',2) #按二进制转换为十进制 ,结果为4
bin(10) #>>'0b1010'
hex(255) #>>'0xff'
oct(10) #>>将十进制转换为八进制 结果为 '012'

关于进制与字符串之间的转换

最常用的还是字符串十六进制的转换,代码如下

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)) #>>['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()

1
2
3
4
5
6
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


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!