字符串和bytes(字节串)之间的转换、字符串和二进制的转换、进制之间的转换以及encode和decode在字符串/字节串/二进制之间的使用

一、字符串和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函数的重写方式:

  1. 首先使用列表推导式,将字符串中的元素一个个取出来
  2. 取出来后使用ord将字符变为10进制数值表示
  3. 然后使用bin函数将10进制数强制转换成2进制数(注意:转换后的数据式str型数据,不是int型数据
  4. 再使用字符串的replace函数,将转换后的字符串型二进制数的0b开头去掉(替换成’’)->最终形成一个每个字符的二进制数组成的列表
  5. 最后再使用join函数,将列表中每个字符的二进制数都连入同一个字符串中,每个字符的二进制数用空格隔开,形成一个二进制字符串

decode函数的重写方式:

  1. 使用了嵌套列表推导式
  2. 内部推导式,先使用split函数将字符串切割成列表,然后进行遍历
  3. 使用int将列表中的每个元素强制转换成int型数据,其中int(b,2)中2的作用式给base赋值,表示二进制数转10进制,如果不加2,转换不成功
  4. 第一个列表推导式形成了十进制列表后作为第二个列表推导式遍历的序列
  5. 第二个列表推导式再遍历的过程中,使用chr将列表中的每个十进制数转换成字符后,形成一个字符列表
  6. 最后使用join函数,将列表转换成字符字符串
"""
此段代码借用的:(Floating Snow博主的)https://blog.csdn.net/qq1437715969/article/details/103591057?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
"""
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))    #不能转换
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值