一、字符串和bytes(字节串)之间的转换
1、转换方式:
1) 字符串 -> 字节串bytes型
可直接使用bytes或者系统自带的encode函数进行转换
bytes(字符串, encoding=‘utf-8’)
字符串.encode()
应用场景举例:
在hashlib模块中,使用hash算法对象对数据进行加密的时候,数据的类型必须是字节串类,即bytes型,此时就需要用到这个知识点
2) 字节串bytes型 -> 字符串
可直接使用str或者系统自带的decode函数进行转换
str(字节串, encoding=‘utf-8’)
字节串.decode(encoding=‘utf-8’)
举例如下所示:
b = 'acb'.encode()
print(type(b)) #<class 'bytes'>
str_b = str(b, encoding='utf-8')
print(str_b, type(str_b)) # acb <class 'str'>
str_b2 = b.decode(encoding='utf-8')
print(str_b2, type(str_b2)) # acb <class 'str'>
应用场景:
二、字符串和二进制之间的转化
转换方式:
解释:
encode函数的重写方式:
- 首先使用列表推导式,将字符串中的元素一个个取出来
- 取出来后使用ord将字符变为10进制数值表示
- 然后使用bin函数将10进制数强制转换成2进制数(注意:转换后的数据式str型数据,不是int型数据
- 再使用字符串的replace函数,将转换后的字符串型二进制数的0b开头去掉(替换成’’)->最终形成一个每个字符的二进制数组成的列表
- 最后再使用join函数,将列表中每个字符的二进制数都连入同一个字符串中,每个字符的二进制数用空格隔开,形成一个二进制字符串
decode函数的重写方式:
- 使用了嵌套列表推导式
- 内部推导式,先使用split函数将字符串切割成列表,然后进行遍历
- 使用int将列表中的每个元素强制转换成int型数据,其中int(b,2)中2的作用式给base赋值,表示二进制数转10进制,如果不加2,转换不成功
- 第一个列表推导式形成了十进制列表后作为第二个列表推导式遍历的序列
- 第二个列表推导式再遍历的过程中,使用chr将列表中的每个十进制数转换成字符后,形成一个字符列表
- 最后使用join函数,将列表转换成字符字符串
"""
此段代码借用的:(Floating Snow博主的)
"""
def encode(s):
return ' '.join([bin(ord(c)).replace('0b', '') for c in s])
def decode(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
var1 = encode("Hello World , 你好 世界。") #字符串转二进制表现形式的字符串
print(var1)
print(decode(var1)) #二进制形式的字符串转换为字符型字符串
var1Arr = var1.split(" ")
for i in range(len(var1Arr)):
print(var1Arr[i])
直接对int型二进制数使用str强制转换,输出的式他的10进制数,类型为str型,所以并没有成功转换成二进制数所代表的字符,不能使用此种方法将二进制数转化成字符
对字符串二进制数使用int强制转换,输出的式它的10进制数,类型为int型,再使用chr函数就可以转换成字符,所以此种方法正确
a=0b11
b='0b11'
c=str(a) #int型的
d=int(b,2)
print(c,type(c)) #3 <class 'str'>
print(d,type(d)) #3 <class 'int'>
三、进制之间的转换
1. int数据
十进制、16进制(0x)、8进制(0o)、2进制0b 都是int型
num = 23
num1 = 0b1010 # python中的二进制数表示方式,在数字前面加上0b(二进制基数:0,1)
num8 = 0o76 # python中的八进制数表示方式,在数字前面加上0o(八进制基数:0~7)
num16 = 0x78 # python中的十六进制的表示方法,在数字前面加上0x(十六进制奇数:0~10,A~F)
print(num1) # print(其他进制数)- 查看对应的十进制数
print(num8)
print(num16)
2.10进制转换其它进制(转换后的数据式字符串,不是int型数据)
bin->10进制转二进制
oct->10进制转8进制
hex->10进制转16进制
print(bin(89)) # 0b1011001
print(oct(89)) # 0o131
print(hex(89)) # 0x59
3.其他进制转int型
二进制转换为int,需要添加base参数,并使得base为2
print(int(2.33)) # 2
print(int(1.99)) # 1
print(int(-2.3)) # -2 (浮点数转换成整数的时候知识单纯的保存整数部分)
print(int(10+3j)) # 复数不能转换成int类型
print(int(True)) # 1
print(int(False)) # 0
# print(int("12.5")) # 不能转换
print(int("-120")) # 可以转换
# print(int("0b111")) # 不可以转换:invalid literal for int() with base 10: '0b111'
print(int("0b111",base=2)) # 7:base控制的进制,默认是10进制,要加引号
print(int(0b111,2)) #报错,0b111必须加引号
a='0b111'
print(int(a,2)) #可以转换
a='111'
print(int(a,2)) #可以转换
a=0b111
print(int(a,2)) #不能转换