Python2:为什么在struct.pack()和struct.unpack()方法中切换bytestring顺序?

Python2:为什么在struct.pack()和struct.unpack()方法中切换bytestring顺序?,python,struct,hex,Python,Struct,Hex,在Python2.7.5中,我有一个十六进制0xbba1,我想用bytestring格式对其进行更改 >>> bytetoint = lambda bytestr: struct.unpack('H', bytestr)[0] >>> hextobyte = lambda hexnum: struct.pack('H', hexnum) >>> hextobyte(0xbba1) '\xa1\xbb' >>> hex(byt

在Python2.7.5中,我有一个十六进制0xbba1,我想用bytestring格式对其进行更改

>>> bytetoint = lambda bytestr: struct.unpack('H', bytestr)[0]
>>> hextobyte = lambda hexnum: struct.pack('H', hexnum)
>>> hextobyte(0xbba1)
'\xa1\xbb'
>>> hex(bytetoint('\xa1\xbb'))
'0xbba1'
为什么第一个字节“\xa1”和第二个字节“\xbb”在适当的位置切换

如何从hex获得正确的测试环,或者从hex获得正确的测试环

e、 g.0xbba1->'\xbb\xa1' '\xbb\xa1'->0xbba1

这是一件事。您不能真正地说字节是交换的,因为
int
定义中没有说明表示它的字节的排列顺序

您得到的结果是一个完全可用的小endian表示。如果您想强制使用big-endian,这对人类读者来说可能会更好,您可以使用
指定字节顺序:

>>> import struct
>>> struct.pack('>H', 0xbba1)
'\xbb\xa1'
>>> hex(struct.unpack('>H', '\xbb\xa1')[0])
'0xbba1'
这是一件事。您不能真正地说字节是交换的,因为
int
定义中没有说明表示它的字节的排列顺序

您得到的结果是一个完全可用的小endian表示。如果您想强制使用big-endian,这对人类读者来说可能会更好,您可以使用
指定字节顺序:

>>> import struct
>>> struct.pack('>H', 0xbba1)
'\xbb\xa1'
>>> hex(struct.unpack('>H', '\xbb\xa1')[0])
'0xbba1'
首先阅读,以便了解问题的根源。在一台典型的基于x86的带有少量endian CPU的计算机上,
int(0xbba1)
的正确内存表示形式是两个字节
a1bb
,按顺序排列

如果确实要从相反的大端顺序解码字节字符串,请参阅:

首先阅读,以便了解问题的根源。在一台典型的基于x86的带有少量endian CPU的计算机上,
int(0xbba1)
的正确内存表示形式是两个字节
a1bb
,按顺序排列

如果确实要从相反的大端顺序解码字节字符串,请参阅:


请参见顶部的注释。请参见顶部的注释。太棒了,在几秒钟内彼此的响应几乎完全相同;-)太棒了,几秒钟内几乎完全相同的反应;-)