为什么在python中一个字符有4个字节?
它给我13分。但我认为应该是4+1+4+1=10字节。它似乎存储了一个字节的“\n”,但存储了4个字节的“\t”。你有什么想法?为什么在python中一个字符有4个字节?,python,python-2.7,struct,Python,Python 2.7,Struct,它给我13分。但我认为应该是4+1+4+1=10字节。它似乎存储了一个字节的“\n”,但存储了4个字节的“\t”。你有什么想法? 谢谢 要获取实际结构大小,请使用: 这是因为您使用的是默认对齐方式,然后应用C规则: 默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过pad字节来正确对齐(根据C编译器使用的规则) 第一个ic将只有5个字节,但如果您列出两次,C将把它填充到8,因此下一个ic对将它增加到13。如果您使用3个ic对,您将得到21个,以此类推。C填充i整数以对齐到4字节
谢谢 要获取实际结构大小,请使用: 这是因为您使用的是默认对齐方式,然后应用C规则: 默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过pad字节来正确对齐(根据C编译器使用的规则) 第一个
ic
将只有5个字节,但如果您列出两次,C将把它填充到8,因此下一个ic
对将它增加到13。如果您使用3个ic
对,您将得到21个,以此类推。C填充i
整数以对齐到4字节组。这用于提高内存性能,但在尝试将其用于不同目的时可能会出现意外情况
改为选择显式字节顺序:
>>> import struct
>>> struct.calcsize('icic')
13
请参阅。要获取实际结构大小,请使用: 这是因为您使用的是默认对齐方式,然后应用C规则: 默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过pad字节来正确对齐(根据C编译器使用的规则) 第一个
ic
将只有5个字节,但如果您列出两次,C将把它填充到8,因此下一个ic
对将它增加到13。如果您使用3个ic
对,您将得到21个,以此类推。C填充i
整数以对齐到4字节组。这用于提高内存性能,但在尝试将其用于不同目的时可能会出现意外情况
改为选择显式字节顺序:
>>> import struct
>>> struct.calcsize('icic')
13
请参阅。为什么不看看struct.pack('icic',1',\t',2',\n')本身?您指的是源代码?不,我指的是函数调用的结果。在我的机器上,这给出了
'\x01\x00\x00\x00\x00\t\x00\x00\x02\x00\x00\x00\n'
,这意味着1为4字节(小尾端),\t为4字节,2为4字节(LE),\n为1字节。这又意味着在\t
之后插入三个0字节。如果你看一下这个,你会得到一些进一步的步骤。顺便说一句,你的文件格式应该是可移植的,这样你就可以在不同架构的机器之间轻松地共享它们。为此,应使用>
前缀。在这种情况下,你有你想要的字节顺序,没有填充字节。你为什么不看看struct.pack('icic',1',\t',2',\n')
本身?你是指源代码?不,我是指函数调用的结果。在我的机器上,这给出了'\x01\x00\x00\x00\x00\t\x00\x00\x02\x00\x00\x00\n'
,这意味着1为4字节(小尾端),\t为4字节,2为4字节(LE),\n为1字节。这又意味着在\t
之后插入三个0字节。如果你看一下这个,你会得到一些进一步的步骤。顺便说一句,你的文件格式应该是可移植的,这样你就可以在不同架构的机器之间轻松地共享它们。为此,应使用>
前缀。在本例中,您拥有所需的字节顺序,但没有填充字节。非常感谢。我从没想过是因为填充物。非常感谢。我从没想过这是因为填充物。
>>> struct.calcsize('>icic')
10