Python 3如何进行数字格式或格式字符串类型的字节流和真实数据对象(如字符串或位数表示的数字等)之间的转换

诸神缄默不语-个人技术博文与视频目录

我这个为什么突然需要学习字节流和数据对象之间的转换呢……因为我们公司有一个用多种语言来处理数据的需求,最终选择的解决方案是直接用字节流来存储数据。所以我现在需要用Python 3来手动解码一下这个数据,故有此文。

Python 3中字节流对象是b开头的字符串。字节流本质上是一串数字(0-256之间的数字),所以一个字节流对象可以转换成一个数字列表。

1. 字符串 → 字节流:str.encode()

example_str="这是一串示例性字符串"
example_bytes=example_str.encode()
number_bytes=list(example_bytes)

str.encode()入参:

  • encoding: str = "utf-8"
  • errors: str = "strict"

example_bytes:b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xb2\xe7\xa4\xba\xe4\xbe\x8b\xe6\x80\xa7\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'

number_bytes:
[232, 191, 153, 230, 152, 175, 228, 184, 128, 228, 184, 178, 231, 164, 186, 228, 190, 139, 230, 128, 167, 229, 173, 151, 231, 172, 166, 228, 184, 178]

2. 字节流 → 字符串:bytes.decode()

number_bytes=[232, 191, 153, 230, 152, 175, 228, 184, 128, 228, 184, 178, 231, 164, 186, 228, 190, 139, 230, 128, 167, 229, 173, 151, 231, 172, 166, 228, 184, 178]
example_bytes=bytes(number_bytes)
example_str=example_bytes.decode()

入参和encode()的相同

3. 数字 + format → 字节流:struct.pack()

以float数据(format为'f',用4个字节表示的数据)为例:

import struct

bytes_flow=struct.pack("f", 298.76953125)  # b'\x80b\x95C'
number_bytes_flow=list(bytes_flow)  # [128, 98, 149, 67]

这里的format是以C语言里的对象格式为准。毕竟Python里面的数字就只有int和float格式嘛。
format全部的表格可以参考:https://docs.python.org/3/library/struct.html#format-characters
其中Standard size就是一个这个格式的数据对象需要用几个字节来表示。

4. 字节流 + format → 数字:struct.unpack()

import struct
float_num = struct.unpack("f", bytes([128, 98, 149, 67]))  # 返回值是一个元组对象,其中第一个元素就是我们所需的数字:(298.76953125,)

5. 本文撰写过程中参考的其他网络资料

  1. python struct.unpack和struct.pack详解
  2. python 4字节数组转float
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值