我有十六进制字符串形式的数据,我将其转换为float:
import struct, binascii
a = '0X437A1AF6'
x = struct.unpack('>f', binascii.unhexlify(str(a)[2:]))
print(x[0])
我得到了正确的结果,但我如何证明使用大端序'>f'是正确的选择,或者我如何确定一般使用什么端序?试错是一种选择,但还有其他选择吗?
Endianness是对象中字节的排序方式。我知道你在代码中使用了浮点数,但为了简单起见,我在这里使用整数。
大端序表示字节从大到小的顺序:内存中的437a1af6
表示43 7a 1a f6
或1132075766
。
小端序表示字节顺序从小到大:内存中的437a1af6
表示f6 1a 7a 43
或-166036925
(有符号时),或4128930371
(无符号时)。
浮点也有特定的字节顺序,见这里。端序会影响浮点数表示的字节顺序,并且会极大地改变返回的值。
只要保持一致,使用哪个端序并不重要,但在当前的x86实现中,小端序更常用。选择没有对错之分。
在你的例子中,小端序解包到-7.832944125711889e+32
,大端序解包到250.10531616210938
。