Python 2.7 Python struct.pack()行为 data=5 Result1=struct.pack(“

Python 2.7 Python struct.pack()行为 data=5 Result1=struct.pack(“,python-2.7,Python 2.7,来自: 此模块在Python值和表示为Python字符串的C结构之间执行转换 这意味着它将把参数的内存表示形式打印为字符序列。内存(以及内存中的所有内容)是一个字节序列。每个字节都有一个值[0..255](为了简单起见,我使用无符号)因此,当它将表示一个字节时,它将首先搜索具有与字节值匹配的ASCII码的字符,如果找到这样一个(可打印)字符,它将是该字节的表示形式,否则表示形式将是字节值(十六进制),前面加上\x(表示不可打印字符的约定).作为旁注,(非扩展)ASCII字符的值介于0和128之间

来自:

此模块在Python值和表示为Python字符串的C结构之间执行转换

这意味着它将把参数的内存表示形式打印为字符序列。内存(以及内存中的所有内容)是一个字节序列。每个字节都有一个值[0..255](为了简单起见,我使用无符号)因此,当它将表示一个字节时,它将首先搜索具有与字节值匹配的ASCII码的字符,如果找到这样一个(可打印)字符,它将是该字节的表示形式,否则表示形式将是字节值(十六进制),前面加上\x(表示不可打印字符的约定).作为旁注,(非扩展)ASCII字符的值介于0和128之间

例如:

  • 65(十六进制0x41)的字节值将表示为“A”(因为A的ASCII码是65

  • 字节值217(十六进制0xd9)将简单地表示为“\xd9”(此ASCII代码没有可打印的字符)

在进一步讨论之前,需要了解一下endianness:这就是数据(本例中的数字)在计算机内存中的表示方式。几个链接(尽管可以在internet上找到许多资源):

我将尝试简要解释big和little-endian之间的区别(同样,为了简单起见,我将只使用8位原子元素大小)

假设我们在一张纸上做一些记忆表示练习,或者更好:在黑板上。如果我们将黑板表示为计算机内存,那么左上角将是它的开始(地址0),地址将随着我们向右移动而增加(当我们到达右边缘时,也向下到下一行)。
我们希望将数字0x12345678表示为一个4字节的数字,从左上角开始(每个字节正好由2个十六进制数字组成):

数字的最高有效字节存储在最低的内存地址(最低有效字节存储在最高的内存地址,即大端。对于小端,数字字节的顺序相反

作为结论,人类认为“大端”

我想介绍的另一个主题是:类型(更准确地说是int>)。Python基于C,继承了它的原生类型,因此int将有4个字节(在某些平台/架构上可能有8个字节)。因此,int(同样,谈论unsigned)有一个值[0..4294967295]。但即使是较小的值:例如5(只需要1个字节),它仍将占用4个字节:未使用的(最高有效)字节将用0s填充。因此,4字节无符号整数的数字将是(十六进制):0x00000005


现在,回到我们的问题上来:如上所述,50x05(或者0x00000005-4字节无符号整数)或者是字符:\x00\x00\x00\x05“。但它的显示顺序与struct.pack的显示顺序相反;我想您已经猜到了原因:它是以小尾端表示的。这是由第一个(fmt)参数(“
print repr(Result1)
(初始化后)给出的)您将看到实际发生的情况。
@CristiFati
使用数据
5
它是
'\x05\x00\x00\x00'
和数据
5555555
它是
'\x03\xd9\x00\x00'
那么,这些是ByTestRing?那么,该代码究竟做了什么来获取这些字节字符串呢?它是否将
5555555555555
读取为整数并转换为
字节
?这些看起来像是带有
/x
前缀的十六进制数,但我仍然不明白其中发生了什么,例如,代码是如何计算出
'\x03'
的?我真的需要一步一步地手动完成。这是否回答了您的问题?
data = 5 
Result1 = struct.pack("<L", data)
╔═══════════╦══════════╦══════════╦══════════╦══════════╗
║   Byte    ║    01    ║    02    ║    03    ║    04    ║
╠═══════════╬══════════╬══════════╬══════════╬══════════╣
║   Value   ║   0x12   ║   0x34   ║   0x56   ║   0x78   ║
╚═══════════╩══════════╩══════════╩══════════╩══════════╝