Python3 数据编码方式

2024-08-29 16:08
文章标签 方式 python3 数据编码

本文主要是介绍Python3 数据编码方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1 Python3 的数据编码
      • 1.1 字符串
      • 1.2 字节串
    • 2 字符串与字节串的相互转化
      • 2.1 字符串转化为字节串
      • 2.2 字节串转化为字符串
    • 3 十六进制字符串
      • 3.1 十六进制字符串转化为字节串
      • 3.2 字节串转化为十六进制字符串
    • 4 参考资料

1 Python3 的数据编码

Python3 统一了编码方式,字符串就是 str,字节串就是 bytes。字符串 str 其实就是文本,统一使用 Unicode 编码。而字节串 bytes 就是原始的字节,本质是二进制数值。它们两者之间可以互相转化。

1.1 字符串

字符串举例:

>>> s = '字符串abc'
>>> s
'字符串abc'
>>> type(s)
<class 'str'>

如上例,字符串使用引号表示。Python3 统一使用 Unicode 编码,所以可以正常显示多种语言文字。

1.2 字节串

字节串举例:

>>> b = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> b
b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> type(b)
<class 'bytes'>

如上例,一个字节串是以 b 开头,每个字节使用十六进制数值表示的串。因为字节串是存储于计算机中的最原始的数据,本质上二进制数值,但是为了提高阅读效率,一般使用十六进制表示。每个字节以 \x 开头,表示这是一个原始的二进制值。但是,在上例中,最后三个字节却没有以 \x 开头,显示的是字母 abc。这就牵扯到 Python 的显示规则了,如果该十六进制值表示的是能够打印的 ASCII 码值,那么就直接打印出来,不使用十六进制表示。实际上,如果将末尾字母 abc 使用以 \x 开头的十六进制表示,其本质也是相等的。

>>> a = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'
>>> b = b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\x61\x62\x63'
>>> a == b
True

如上例,将 abc 使用其对应的十六进制 0x61,0x62,0x63表示,也是与原始字节串相等的。

2 字符串与字节串的相互转化

字符串与字节串的转化可以使用 encode() 和 decode() 两个函数:

  • 字符串转化为字节串:encode(),编码。
  • 字节串转化为字符串:decode(),解码。

encode 和 decode 默认采用 utf-8 编码。

2.1 字符串转化为字节串

>>> '字符串abc'.encode()
b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'

2.2 字节串转化为字符串

>>> b'\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2abc'.decode()
'字符串abc'

3 十六进制字符串

在实际编程中,经常遇到十六进制字符串。

>>> s = 'cc4a5ce1b3'
>>> type(s)
<class 'str'>

如上例,为了说明方便,本文把形如上例的字符串 s 称为十六进制字符串。当然,该字符串的长度肯定是偶数。s 本质上是一个字符串,但是在实际的编程实例中,其表示原始数据,为了用户友好,将原始的字节数值转化为用户可以看到的十六进制字符串。

3.1 十六进制字符串转化为字节串

在数据运算中,例如将该数据进行哈希运算,肯定要对其原始二进制数值进行哈希运算。那么就需要将该十六进制字符串转化为原始的字节串。

在 Python3 中,可以使用 bytes.fromhex()、binascii.a2b_hex()、binascii.unhexlify() 函数将十六进制字符串转化为其原始二进制数值,即以 \x 开头表示的每个字节。

>>> bytes.fromhex('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
>>> binascii.a2b_hex('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'
>>> binascii.unhexlify('cc4a5ce1b3')
b'\xccJ\\\xe1\xb3'

如上例,以上三个函数都可将十六进制字符串转化为以 b 开头的字节串。但是,推荐使用 bytes.fromhex() 函数。这是因为该函数可以有效处理十六进制字符串中的空格,可以自动处理空格。

>>> bytes.fromhex('cc4a  5c e1b3')
b'\xccJ\\\xe1\xb3'

如上例所示,如果十六进制字符串中含有空格,则 bytes.fromhex() 函数可以正确处理。

3.2 字节串转化为十六进制字符串

可以使用 hex() 函数将原始数据字节串转化为可以阅读的十六进制字符串。该函数是 Python3.5 新加入的。

>>> b'\xccJ\\\xe1\xb3'.hex()
'cc4a5ce1b3'
>>> binascii.b2a_hex(b'\xccJ\\\xe1\xb3').decode()
'cc4a5ce1b3'
>>> binascii.hexlify(b'\xccJ\\\xe1\xb3').decode()
'cc4a5ce1b3'

如上例,可将以 b 开头的字节串转化为十六进制字符串。虽然有三种方式可以此目标,但是还是推荐使用 hex() 函数更简单快捷。

4 参考资料

  • python3的decode()与encode()

这篇关于Python3 数据编码方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118323

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制