Python struct与小端存储

在使用Python 实现字符向字节数据类型转换的时候,Python没有提供专门处理字节的数据类型,不过Python提供了一个Struct模块提供bytes和其他二进制数据类型的转换

pack(),将任意数据类型转变为bytes数据类型

>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'

pack的第一个参数是处理指令,’>I’的意思是:

>表示字节顺序是big-endian,也就是网络序,I表示4字节无符号整数。

后面的参数个数要和处理指令一致。如果不一致会报错

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> struct.pack('I','2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: required argument is not an integer
>>>

unpack把bytes变成相应的数据类型:

>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)

H代表两个字节的无符号整数,

c代表一个字节的字符

所以,尽管Python不适合编写底层操作字节流的代码,但在对性能要求不高的地方,利用struct就方便多了。

小端存储

与数据在存储器中的存放地址有关

小端存储:较低的有效字节存放在较低的存储器地址,较高的有效字节存放在较高的存储器地址

大端存储:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址

为什么会有较高的有效字节,和较低的有效字节的区分呢?

这是因为目前的计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit,而C语言中除了有8bit的char外,还有16bit的short类型,还用32bit的long类型(不同的编译器还不一样),那么加入我们存放一个长度32bit的整数:

(由于一个地址单元是8bit,需要将这个长度为32bit的数据存放在4个地址单元中)
在这里插入图片描述
另外,对于16位或者32位的这些寄存器长度大于8位的处理器,由于寄存器的宽度大于一个内存地址,也面临这一个如何将多个字节安排的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值