【问题标题】:Understanding Python's struct pack/unpack functions了解 Python 的 struct pack/unpack 函数
【发布时间】:2020-10-28 09:24:06
【问题描述】:

我正在开发一个项目,其中包括在 python3.6 中使用 struct 模块及其 pack/unpack 函数

我参考了很多文章,如this one 并且已经有了基本的想法,但我无法理解我的用例。

例如:

var = struct.pack('i',1) 
print(var) 

它给出了输出b'\x01\x00\x00\x00',我可以理解,因为我们提到了 int 作为格式,因此输出是 4 个字节。

现在再举一个例子:

var = struct.pack('i', 1156888062)

现在在这种情况下为什么输出b'\xfe\xb5\xf4D'。谁能解释一下。

当我打开它的时候

print(struct.unpack('f', var))

怎么输出是(1957.687255859375,)

【问题讨论】:

  • 你为什么把它打包成一个整数并解包一个浮点数?

标签: struct python-3.6


【解决方案1】:
>>> struct.pack('i', 1156888062)
b'\xfe\xb5\xf4D'

这仍然是四个字节,只是其中一个字节是可打印的 ASCII 字符D,所以它显示为那个而不是\x44。这只是一种不同的表现形式。证明:

>>> len(b'\xfe\xb5\xf4D')
4
>>> b'\x44'
b'D'

对于最后一点,您需要使用与打包时相同的格式说明符 unpack。您要求将相同的四个字节解释为浮点数,因此显然它会给您带来不同的结果。将其更改为'i',它将按预期工作:

>>> struct.unpack('f', var)
(1957.687255859375,)
>>> struct.unpack('i', var)
(1156888062,)    

【讨论】:

  • 我想要浮点数的结果,这就是为什么使用f
  • “我想要浮点数的结果”到底是什么意思?您在寻找1156880862.0 吗?因为解释为intfloat 的相同四个字节将意味着截然不同的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2017-05-30
  • 2023-04-06
  • 2014-10-28
  • 2012-12-26
  • 1970-01-01
相关资源
最近更新 更多