binascii.unhexlify 在 Python 3.2 和 Python3.4 中的工作方式不同?

binascii.unhexlify working differently in Python 3.2 and Python3.4?

我以前在Linux Mint上工作,嵌入其中的Python 3最新版本是Python 3.4。我的程序将一个十六进制字符串作为输入,对其进行解码并创建一个 bytearray,这样我就可以使用 struct.unpack 解码多个信息。例如:

hex_str = "00000E0C180E180FEABF070030313564336332363338303431653039004A62004A62006A62406A622E636F6D00"
s = binascii.unhexlify(hex_str)
print(s) # Would print b'\x00\x00\x0e\x0c\x18\x0e\x18\x0f\xea\xbf\x07\x00015d3c2638041e09\x00Jb\x00Jb\x00jb@jb.com\x00'
data = bytearray(s)
date_data = data[:9]
form_date = get_date(date_data) # Get the date using a bunch of struct.unpack
print(form_date)  # Would print '2014-12-24 14:24:15'

上周我的电脑坏了,所以我不得不组装一台新机器。我决定尝试 Debian Wheezy。但是,我发现 Python 的唯一版本是 Python 2.7。我使用 apt-get 安装了 Python 3,但我注意到安装的版本只有 Python 3.2。当我运行与上面完全相同的代码时,我在 binascii.unhexlify 行上得到一个 TypeError

hex_str = "00000E0C180E180FEABF070030313564336332363338303431653039004A62004A62006A62406A622E636F6D00"
s = binascii.unhexlify(hex_str)
# TypeError: 'NavigableString' does not support the buffer interface

我不明白这个错误,这是什么意思? 我检查了 Google 但找不到任何东西:两个版本之间 binascii.unhexlify 有什么变化吗?我必须在 3.2 中更改某些内容吗?

我真的不知道如何解决这个问题...也许有更好的方法来实现它?

谢谢。

PS:我可以返回 Linux Mint,或在 Debian 上安装 Python 3.4,但我认为我的生产服务器是 Debian 的全新安装,所以使用 Python 3.2... 所以我最好以该版本为目标(很高兴我现在发现了它!)。

是的,版本之间的行为发生了变化。来自 binascii module documentation:

Note: a2b_* functions accept Unicode strings containing only ASCII characters. Other functions only accept bytes-like objects (such as bytes, bytearray and other objects that support the buffer protocol).

Changed in version 3.3: ASCII-only unicode strings are now accepted by the a2b_* functions.

所以如果你想定位 Python <3.3,你需要传入 bytesbytearray 对象而不是字符串。