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

相关文章

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室