data = 5
Result1 = struct.pack("<L", data)
01000000 00010100 00000000 00000000 00000000 00000000 00000000 00000000
?Result1
中。那是00000000 00000000 00000000 00000000 00000000 00000000 00010100 01000000
是这个代码到底发生了什么,还是我误解了什么?
答案 0 :(得分:2)
来自[Python 2]: struct - Interpret bytes as packed binary data:
此模块执行Python值和表示为Python字符串的C结构之间的转换。
这意味着它会将参数的内存表示形式打印为 char 序列。内存(以及驻留在其中的所有内容)是一个字节序列。每个字节都有一个值 [0..255] (为简单起见,我使用 unsigned )。
因此,当它表示一个字节时,它将首先搜索 char ,其 ASCII 代码与字节值匹配,如果是这样的话( > printable )找到 char ,它将是该字节的表示,否则表示将是前面的 hex 的字节值> \ x (用于表示不可打印的 char 的约定)。作为旁注,(非扩展) ASCII char 的值在 0 和 128 之间。
示例:
字节值 65 ( hex 0x41 )将被表示为“ A ”(因为 A 的 ASCII 代码 65 )
字节值 217 ( hex 0xd9 )将简单地表示为“ \ xd9 ”(此 ASCII 代码没有可打印的 char )
在进一步说明之前,需要关于 endianness 的几句话:这就是数据(在我们的例子中是数字)在计算机内存中的表示方式。几个链接:
我将尝试简要解释 big 和 little endian 之间的区别(再次,为了简单起见,我会坚持使用 8 bit atomic < / em>仅限元素大小。)
想象一下,我们正在一张纸上做一些记忆表现练习,或者更好:在黑板上。如果我们将黑板表示为计算机内存,那么左上角将是它的开头(地址 0 ),地址会随着我们向右移动而增加(当我们到达右边缘时,也会向下到下一行)。
我们希望将数字 0x12345678 表示为 4 字节数,从左上角开始(每个字节由完全 2 hex 数字组成):
<强>字节强>:
0 1 2 3
的值强>:
0×12 0x34 0x56储存0x78
我们的号码 最重要的 字节存储在 最低 内存地址(最低有效字节存储在最高), big endian 。对于 little endian ,我们的数字字节顺序相反。
作为结论,人们认为“ big endian ly。”。
我想要讨论的另一个主题是:类型( int 更精确)。 Python ,基于 C ,继承其本机类型,因此 int 将具有 4 字节(在某些平台上) /架构它可能有 8 )。因此, int (再次,谈论 unsigned )的值为 [0..4294967295] 。但即使是较小的值:例如 5 (只需要 1 字节),它仍然会占用 4 字节:(最重要的) )未使用的字节将用 0 s填充。因此,我们作为 4 字节 unsigned int 的数字将是( hex ): 0x00000005 强>
现在,回到我们的问题:如上所述, 5 是 0x05 (或 0x00000005 - 4 字节 unsigned int )或字符:“ \ x00 \ x00 \ x00 \ x05 ”。但它与struct.pack
显示的顺序相反;我想你已经猜到了原因:它在 little endian 表示中。这是由1 st ( fmt )参数给出的(“ &lt; ”部分更精确)给予[Python 2]: struct.pack(可能的值列在同一页面上:[Python 2]: Byte Order, Size, and Alignment)。
对于 55555 ,事情就是一样的。其十六进制表示为: 0xd903 或 0x0000d903 。
如果它还没有意义,请通过输入 data_set 的不同值并使用它来稍微修改一下代码并使用它,并查看输出:
code.py :
import struct
fmt = "<L"
data_set = [5, 55555, 0x12345678]
for data in data_set:
output_str = "{} - {}".format(hex(data), repr(struct.pack(fmt, data)).strip("'")) # This is just for formatting output string to be displayed to the user
print(output_str) # Python3 compatible (however the formatting above won't behave nicely)
<强>输出强>:
c:\Work\Dev\StackOverflow\q037990060>"C:\Install\x64\HPE\OPSWpython\2.7.10__00\python.exe" "code.py" 0x5 - \x05\x00\x00\x00 0xd903 - \x03\xd9\x00\x00 0x12345678 - xV4\x12