Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在python中一个字符有4个字节?_Python_Python 2.7_Struct - Fatal编程技术网

为什么在python中一个字符有4个字节?

为什么在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字节

它给我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字节组。这用于提高内存性能,但在尝试将其用于不同目的时可能会出现意外情况

改为选择显式字节顺序:

>>> 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