python - bytes & 编码解码

【python基础】—python string和bytes类型互相转换(decode()/str()/encode()/bytes()) python string和bytes类型互相转换(decode()/str()/encode()/bytes()) 阅读详情

目录

bytes

str 转 bytes

bytes 转 str

编码解码

base64

URL

参考


经常遇到 bytes 对象的使用会懵逼,故写点笔记。

bytes

str 转 bytes

相对于字符串以字符为单元进行操作,bytes 则以字节为单元进行操作,可以理解为“字节串”(注意,这不是专业术语,只是便于理解的叫法)。看一段代码:

mybytes = b"hello world"           // (1)
mybytes2 = b"好好学习"              // (2)error
mybytes3 = bytes("好好学习", encoding="utf8")     // (3)
mybytes4 = bytes("hello 世界", encoding="utf-8")  // (4)
mybytes5 = "hello 世界".encode("utf-8")  // (5)

(1)字符串前加个 "b" 就是将 "hello world" 字符串转换为 bytes 对象。但最迷惑的是,这段字符串以什么样的字节存储。答案是:如果字符串是一串 ASCII 字符,那么就存储它们的 ASCII 值。所以这里 mybytes 存储的是:

h          e        l         l         o       <空格>     w        o        r       l         d 
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100

(2)如果字符串是一串非 ASCII 码,那么不能使用前缀 b 将字符串转换成 bytes 对象:

错误信息标明只能包含 ASCII 码范围内的字符。

(3)所以,必须用构造函数将字符串转换成 bytes 对象,并且要指定第二个参数,也就是字符集。可以这样理解,我们现在所看到的字符串,例如"好好学习",只是 4 个字符图像,实际在内存中存储什么样的字节内容,就得看给程序指定了哪种字符集,比如指定 utf8:

UTF-8 用 3 个字节存储汉字,所以字节串长度就有 4*3=12 个。默认情况下,python 使用的字符集是 UTF-8。

(4)如果字符串既有 ASCII 字符,又有汉字,那么仍然需要指定字符集。

UTF-8 对 ASCII 字符用一个字节存储,用三个字节存储汉字,所以这里 6+3*2=12 个字节。注意,在控制台输出 bytes 对象时,对 ASCII 字符仍然是打印它们的字符图像,而其他非 ASCII 字符就打印它们的十六进制。

bytes 转 str

用 bytes 对象的 decode() 方法将字节串重新转换成字符串。默认使用 UTF-8 解码,所以一般将字符串转换为 bytes 对象时指定 UTF-8 字符集:

>>> b = bytes("hello 世界",encoding="utf-8")
>>> b
b'hello \xe4\xb8\x96\xe7\x95\x8c'
>>> b.decode()
'hello 世界'
>>> b.decode(encoding="utf-8")
'hello 世界'

当然,也可以用其他字符集,例如 GBK,不过 decode() 就必须指定同样的字符集,否则可能会报错:

>>> b = bytes("hello 世界", encoding="gbk")
>>> b
b'hello \xca\xc0\xbd\xe7'
>>> b.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 6: invalid continuation byte
>>> b.decode(encoding="gbk")
'hello 世界'

hex 转 bytes

现在有一个十六进制字符串:

str = "342ec70264b61f9749aa17558239eddb"

这只是一个以字符串的形式表示一串 0 与 1,注意只是形式,str 变量实际存储的是每个字符的 ASCII 码:

   3        4         2       e      ...
00110011 00110100 00110010 01100101 01....

但我们希望存储的是十六进制转换成的二进制,也就是这样的:

  3    4   2    e    ..
0011 0100 0010 1110 11...

那么这就不能用字符串类型存储了,而是用 bytes 对象。用 bytes.fromhex() 可以将十六进制字符串转换成对应的二进制字节串:

>>> bytes.fromhex("342ec70264b61f9749aa17558239eddb")
b'4.\xc7\x02d\xb6\x1f\x97I\xaa\x17U\x829\xed\xdb'

bytes 转 hex

bytes.hex() 将二进制字节串用十六进制字符串表示:

>>> bytes.fromhex("342ec70264b61f9749aa17558239eddb")
b'4.\xc7\x02d\xb6\x1f\x97I\xaa\x17U\x829\xed\xdb'
>>> bytes.fromhex("342ec70264b61f9749aa17558239eddb").hex()
'342ec70264b61f9749aa17558239eddb'

编码解码

base64

使用 base64 模块,方法:

  • base64.b64encode(bytes)
  • base64.b64decode(str)

例子:

>>> import base64
>>> base64.b64encode(b"hello world")
b'aGVsbG8gd29ybGQ='
>>> base64.b64decode("aGVsbG8gd29ybGQ=")
b'hello world'

如果有非 ASCII 字符,就用 bytes 构造函数:

>>> b = bytes("hello 世界", encoding="utf-8")
>>> base64.b64encode(b)
b'aGVsbG8g5LiW55WM'
>>> base64.b64decode("aGVsbG8g5LiW55WM")
b'hello \xe4\xb8\x96\xe7\x95\x8c'
>>> base64.b64decode("aGVsbG8g5LiW55WM").decode()
'hello 世界'

base64 解码后得到的是 bytes 对象,可以调用 decode() 方法将其转换为字符串。

URL

用到 urllib.quote 模块,方法:

  • quote(str)
  • unquote(str)

例子:

>>> from urllib.parse import quote,unquote,urlencode
>>> quote("好好学习")
'%E5%A5%BD%E5%A5%BD%E5%AD%A6%E4%B9%A0'
>>> unquote("%E5%A5%BD%E5%A5%BD%E5%AD%A6%E4%B9%A0")
'好好学习'

 默认使用 UTF-8 字符集。不过 quote() 并非完全编码,只是对非 URL 规定的字符编码,例如:

>>> quote("+,ab'")
'%2B%2Cab%27

其中 a 和 b 就没有被 URL。所以,如果进行完全 URL 编码,可以遍历每个字符,得到它们的十六进制数字,然后在前面拼接 "%"。

参考

http://c.biancheng.net/view/2175.html

​第13章 Python数据类型详解之分解理解:bytes(不可变字节序列)​ bytes。 阅读详情

相关推荐

java拼接字节数组轻量高效实现Mybytes

自定义byte数组,可变长度,轻量高效,解决集合存储简单数据的包装问题,自增缓存减少运算,方便多次调用,非线程同步

字节bytes,编码和解码

00000000 :8位代表一个字节bytes gbk编码(国标扩):一个中文占用2个字节 utf-8(万国码):一个中文占用3个字节 gbk和utf-8不能直接进行转换,否则会出现乱码(因为他们的字节占用不一样) # bytes,编码和解码 # asci码 s='周杰伦' s1 = s.encode('gbk') print(s1) # 输出:b'\xd6\xdc\xbd\xdc\xc2\xd7' # gbk编码,一个中文占2个字节,所以这里3个中文,占用6个字节 s2 = s.encode(

wanggaoxingH的博客 3505

从零开始:使用Labelme完成图像语义分割标注全流程

本文详细介绍了如何使用Labelme工具完成图像语义分割标注的全流程,从环境安装、数据准备到核心标注操作,并重点讲解了如何将标注结果转换为PASCAL VOC等深度学习框架可用的标准数据集格式。文章还提供了关键的避坑指南和高效技巧,帮助初学者快速上手,高效产出高质量的标注数据。

weixin_29073241的博客 492

Python bytes decode() 方法

描述 bytes decode() 方法以指定的编码格式解码 bytes 对象,默认编码为 'utf-8'。 对应的编码方法:encode() 方法 。 语法 Python bytes decode() 方法语法: B.decode([encoding=&quot;utf-8&quot;][,errors=&quot;strict&quot;]) 参数 encoding -- 可选参数,要使用的编码,默认编码为...

weixin_33750452的博客 974

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码)

本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。

weixin_26950847的博客 262

【QML初学者文档】一问读懂QML基础开发(内附大量简单源码)

QML是Qt的一大特色,拥有强大的UI制作能力。但是想要学好QML,还需要一些细节和技巧的掌握。本篇文章将为你提供完整的QML知识体系,让你成为Qt的UI魔法师!

BenBierBa的博客 2万+

python_bytes(字节串)/string(字符串)/unicode码/utf-8编码/字面值/原始字符串/字符串编码&字节解码

文章目录linkcontentbytes 对象class bytes([source[, encoding[, errors]]])字面值(literal values) link https://docs.python.org/zh-cn/3/library/stdtypes.html#bytes-objects content 二进制序列类型 — bytes, bytearray, memoryview 操作二进制数据的核心内置类型是 bytes 和 bytearray。 它们由 memoryview

xuchaoxin1375的博客 3096

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1383

python中的bytes,str类型, 以及编码解码

文章目录python中的bytes,str类型, 以及编码解码 python中的bytes,str类型, 以及编码解码 python3中有bytes和string类型 bytes主要是给在计算机看的,string主要是给人看的 中间有个桥梁就是编码规则,现在大趋势是utf8 bytes对象是二进制,很容易转换成16进制,例如\x64 string就是我们看到的内容,例如’abc’ strin...

YiJie__ShuSheng的博客 3267

可乐学习NVMe之一:为什么SSD需要NVMe

1. NVMe SSD 结构简图 整体来看,NVMe SSD可以分为三部分,host端的驱动NVMe Driver、PCIe+NVMe实现的控制器以及NAND Flash+DDR4/DDR5存储介质。 芯片回片后Host侧软件或者驱动开发主要在应用层,通过一些测试工具进行benchmark跑分测试,performance性能分析,latency分析、stress-testing等等: 那么,接下来阐述为什么SSD需要NVMe,并再后续的文章介绍NVMe协议分析,个人针对协议的理解,如果有不当之处,还请各

Lucky 3169

便携式水下动态实时视频色彩还原设备,一键快速实现对水下偏色视频和图像的色彩还原处理

便携式水下动态实时视频色彩还原,一键快速对水下图像进行色彩校正,清晰度提升和亮度均衡处理,为水下资源勘探和科学考古,海洋生态环境监测,水下机器作业等应用提供有力的协助

weixin_43518680的博客 633

Python str 和 bytes 有关解码、编码的问题

转自:https://www.cnblogs.com/chownjy/p/6625299.html Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数...

herr_kun的博客 1864

全志A527 T527 android13支持usb摄像头

我们发现usb摄像头在A527 android13上面并不能正常使用,需要支持相关的摄像头。

zhutoubenben的专栏 964

python 编码和解码 bytes和bytearray

编码:str --&gt; bytes 解码:bytes --&gt; str str、bytes和bytearray简介 str是字符数据,bytes和bytearray是字节数据。它们都是序列,可以进行迭代遍历。str和bytes是不可变序列,bytearray是可变序列,可以原处修改字节。 bytes和bytearray都能使用str类型的通用函数,比如find()、replace()、islower()等,不能用的是str的格式化操作。所以,如有需要,参考字符串(string)方法整理来获取这些

Bulldozer_GD的博客 813

深度强化学习训练结果曲线绘制教程

使用python语言,只调用matplotlib库,绘制训练过程中保存的强化学习训练曲线。模仿经典论文中的训练曲线,多次训练取平均,并绘制出阴影区域。

加斯顿工程师的博客 910

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python的bytes和str理解,以及解码编码问题。

  尝试将ascii文件转换成utf-8的编码格式.Python3有两种表示字符序列的类型:bytes和str。个人理解是,bytes是计算机能够识别的数据类型,然后str是Unicode字符,即是人比较容易理解的字符类型。 以下代码包含在debug.py文件中: def main(): pass if __name__ == '__main__': main() ...

Yolen_Chan的博客 2755

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python str byte编码_python str与bytes编码解码

编码和解码下面一张图搞懂编码、解码、编码表之间的关系。编码解码不难看出,它们是一种根据编码表进行翻译、映射的过程:编码:str --&gt; bytes解码:bytes --&gt; str实际上,字符串类型只有encode()方法,没有decode()方法,而bytes类型只有decode()方法而没有encode()方法。&gt;&gt;&gt; set( dir(str) ) - set...

weixin_34303763的博客 1403

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python 遍历数组gbk编码_python bytes和bytearray、编码和解码

python bytes和bytearray、编码和解码发布时间:2018-12-27 16:55,浏览次数:314, 标签:pythonbytesbytearraystr、bytes和bytearray简介str是字符数据,bytes和bytearray是字节数据。它们都是序列,可以进行迭代遍历。str和bytes是不可变序列,bytearray是可变序列,可以原处修改字节。bytes和byte...

weixin_39845221的博客 530

python bytes和bytearray、编码和解码

python

weixin_41479678的博客 812

18-python中bytes和 str的关系 以及编码encode,解码decode相关的知识

文章目录1. python当中采取的是哪种编码?2. str 字符串1. 原始字符串3. bytes4. encode() 和decode()1. encode()2. decode() 1. python当中采取的是哪种编码? import sys print(sys.getdefaultencoding()) 程序运行的结果: utf-8 2. str 字符串 1. 原始字符串 Python 字符串中的反斜杠\有着特殊的作用,就是转义字符,例如上面提到的\'和\" 转义字符有时候会带来一些麻烦,例如

梦悦foundation 1547

python 解码gbk_python bytes和bytearray、编码和解码

str、bytes和bytearray简介str是字符数据,bytes和bytearray是字节数据。它们都是序列,可以进行迭代遍历。str和bytes是不可变序列,bytearray是可变序列,可以原处修改字节。bytes和bytearray都能使用str类型的通用函数,比如find()、replace()、islower()等,不能用的是str的格式化操作。所以,如有需要,参考字符串(stri...

weixin_34836906的博客 352

python编码和解码_Python3中编码与解码之Unicode与bytes的讲解

今天玩Python爬虫,下载一个网页,然后把所有内容写入一个txt文件中,出现错误;TypeError: write() argument must be str, not bytesAttributeError: 'URLError' object has no attribute 'code'UnicodeEncodeError: 'gbk' codec can't encode charac...

weixin_39717110的博客 155

python3 编码解码_python3编码与解码

1、字节流与字符串的转换内置函数bytes()与str()bytes()函数可以将字符串按照某一编码规范转换为字节流。其中第一个参数为字符串,第二个参数为编码规范(必填)。如果第一个参数是仅由ascii码字符(ascii码字符是unicode码字符的子集)组成的,则字节流直接以ascii码字符显示。如果不是的话,则在按照不同的编码规范显示。在utf-8编码下,一个汉子占三个字节(一个字节是8位二进...

weixin_39692830的博客 519
上一篇: [代码审计] beecms 4.0 漏洞总结
下一篇: BUUCTF-EasyLogin
friEnd`
博客等级 码龄8年 103粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值