python3 关于 str bytes 小结

str 类型

在 python3 中,str 类型的数据在内存中以 Unicode 编码方式保存,但是 python3 已经将这些封装好了,我们无需关心 str 是怎么实现的,我们需要关心的是这个str 里面有什么字符


bytes 类型

bytes 实际上就是一串数字,各个 str 中的字符按给定的编码方式加工成对应字节流数据。


bytes 与 str 简单转换

python 中,字符串可以有字符串类型(str)和字节流类型(bytes)两种类型表示。
str.encode(‘编码方式’) --> class ‘bytes’
bytes.decode(‘解码方式’) --> class ‘str’

可以想象成:str 是未加工的工料,用某种编码方式将 str “加工”(编码)后便成了 bytes;bytes 用被之前被“加工”的方式“反加工”(解码),便又变成了原来的模样(str)

>>> s = '汉字'
>>>> bytes(s, 'utf-8')
b'\xe6\xb1\x89\xe5\xad\x97'
>>> bytes(s, 'gbk')
b'\xba\xba\xd7\xd6'
# 两个汉字在内存中以 Unicode 方式存储,已经被封装,我们不需要关注,需要关注的是 s 是两个汉字
# 两个汉字经过 utf-8 编码后产生 6 个字节,经过 gbk 编码后产生 4 个字节

Python3 中 bytes 表示方法

一直被 python3 bytes 的表示方法坑了很长时间,看到一堆 \x133E\xc3\x13s\x05\xc3cu 就觉得太恶心不想去看,最近才搞明白具体含义。

Python3 中字节流的输出结果中:如果字节流中的字符是一个可见的 ascii 字符,那就输出其对应的 ascii 字符;如果为非可见 ascii 字符,则以 b’\x**’ 的方式表示一个字节。

l = [97, 1, 255] # 分别是一个字母 a、一个不可见 ascii 字符、一个非 ascii 字符
>>> bytes(l)
b'a\x01\xff'

其中,字节流中一旦出现 \x 的字样,后面就一定会跟两个 16 进制字符,表示一个字节的值。
那么,这小节一开始的 \x133E\xc3\x13s\x05\xc3cu 这是几个字节的字节流数据呢?

这个字节流由 10 个字节组成,分别是:

  1. \x13 = 19
  2. ‘3’ = 51
  3. ‘E’ = 69
  4. \xc3 = 195
  5. \x13 = 19
  6. ‘s’ = 115
  7. \x05 = 5
  8. \xc3 = 195
  9. ‘c’ = 99
  10. ‘u’ = 117

在 Python 中运行实况:

 bs = b'\x133E\xc3\x13s\x05\xc3cu'
 >>> list(bs)
[19, 51, 69, 195, 19, 115, 5, 195, 99, 117]

意外收获

在查阅相关资料博客中意外发现了两个跟 bytes 相关的函数:int.to_bytes()、int.from_bytes(),简单记录一下:

# 第一个参数表示用几个字节表示这个整数。
# 第二个参数表示权重小的在左边还是在右边,big 是左小右大,little 相反
>>> (129).to_bytes(5, 'big')  
b'\x00\x00\x00\x00\x81'



>>> bs = b'\x01\x01'  # 00000001 00000001 = 256 + 1
# 第一个参数传入一个字节流
# 第二个参数同上面的第二个参数
>>> int.from_bytes(bs, 'big')
257
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值