python3 字节与数字、字符等互转的方法。int、struct库等方法

文章详细介绍了Python3中int与bytes的转换,包括int转bytes和bytes转int的方法,以及str与bytes的互转。还提到了struct库在其他格式转字节和字节转其他格式时的作用,包括格式字符串的说明和pack/unpack方法的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字节在存储的时候根据存储的格式不同,可能会有大端小端之分,如果是数字,还有有符号无符号的区分,所以在自己处理的时候可能会有一些麻烦。所以记录一下转换的方法,希望有同样遇到的人可以对其提供一些帮助。

常见的数据类型:

数据类型字节长度取值范围
int81-128 ~ 127
uint810 ~ 255
int162-32768 ~ 32767
uint1620 ~ 65535
int324-2^31 ~ 2^31 -1
uint3240 ~ 2^32 -1

int 与 bytes转换

int与bytes转换,在python3中还是比较简单的,int已经自带了方法,可以直接使用,不过需要事先确定:数据存储方式是大端存储还是小端存储,数据类型是什么。

int 转 bytes

例子:

# int 转 bytes
int.to_bytes(字节长度, 大端/小端存储, 关键字参数有符号还是无符号)
- 大端:big
- 小端:little

# 例如:将数字128存储为int16类型的字节,在计算机里小端存储
# 如果实际数字超出了存储字节的长度,将会报错
int(128).to_bytes(2, 'little', signed=True)

# 结果:b'\x80\x00'

bytes 转 int

例子:

# bytes 转 int
int.from_bytes(字节, 大端/小端存储, 关键字参数有符号还是无符号)
- 大端:big
- 小端:little

# 例如:将刚刚存入的结果转回来
int.from_bytes(b'\x80\x00', 'little', signed=True)
# 如果你使用大端模式解析出来,你会发现一个完全不一样的数字
# 如果是只有一个字节的数据,大端小端也就无所谓了

str 与 bytes互转

这个还是比较简单的。
例如:

# str 转 bytes
# 这个转化只需要对str进行编码就好了,默认使用 utf-8编码
'章三'.encode()

# bytes 转 str
# 相应的,只需要对bytes数据进行解码,默认使用 utf-8 编码
b''.decode()

其他格式转字节

其他格式转字节的话,可以借助struct 库来完成,这里简单介绍一下它的使用方式和一些参数。

在使用struct 库进行转化的时候,需要一个格式字符串说明数据是什么类型的,什么存储方式之类的信息,所以先介绍一下他的格式说明。

格式说明

格式设置字符如下:
第一个字符:存储方式

符号说明
@本机存储顺序、存储大小、存储队列 (默认选项)
=本机存储顺序,标准存储大小、存储队列
<小端序、标准存储大小、存储队列
>大端序、标准存储大小、存储队列
!与 > 相同

其余字符表示参数的类型,必须完全匹配;这些可以在十进制重复计数之前:

符号说明
x填充字节,不是数据
c字符
bbyte类型,1字节整型
B无符号byte
?_Bool (需要 C99;如果不可用,则使用 char 代替)
hshort类型 2字节整型
H无符号short
iint类型 4字节整型
I(大写i)无符号int
l(小写L)long类型 8字节整型
L无符号long
ffloat类型 (32为浮点类型)
ddouble类型
ehalf-float (16位浮点类型)
sstring类型,也可以理解成字节数组。需要在s前存在一个十进制数字表示字符串的长度

格式为:
存储方式 + 类型

例如:

# 小端存储的 uinit32类型
<I

# 大端存储的 float32 类型
>f

# 小端存储的 10个字节的字符串数据
<10s

转字节

转字节使用struct.pack() 方法
该方法可以接收多个参数,分别是:

  • 格式
  • 变量1
  • 变量2

单个转
例如:

# 还是将128转化小端存储的,为2个字节存储的有符号数字类型
struct.pack('<h', 128)
# 因为是2个字节有符号的数字,所以应该选择 short 类型 所以格式为 '<h'
# 结果为:b'\x80\x00'

# 将128.0 转化为小端存储的float类型的字节
struct.pack('<f', 128.)
# 结果为: b'\x00\x00\x00C'

转多个
例如:

# 第一个是无符号整数 128 ,然后后变有一个3个字节的字符串 '秀', 使用小端存储
struct.pack('<I3s', 128, u'秀'.encode())
# 结果:b'\x80\x00\x00\x00\xe7\xa7\x80'

字节转其他

字节转化为其他类型,使用 struct.unpack() 方法,结果是一个元组
该方法可以接收2个参数,分别是:

  • 格式
  • 字节

例如:

# 将第一个是无符号整数 128 ,然后后变有一个3个字节的字符串 '秀', 使用小端存储的数据转回来
struct.unpack('<I3s', b'\x80\x00\x00\x00\xe7\xa7\x80')
# 结果为:(128, b'\xe7\xa7\x80')

# 将使用小端存储的128.0的字节转换回来
struct.unpack('<f', b'\x00\x00\x00C')
# 结果为: (128.0,)

希望可以帮到你!


曾经沧海难为水,
除却巫山不是云。
取次花丛懒回顾,
半缘修道半缘君。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值