gpt4 book ai didi

linux - 在 python 2.7 中编码/解码特殊字符

转载 作者:太空宇宙 更新时间:2023-11-04 10:56:30 26 4
gpt4 key购买 nike

尝试使用 Raspberry Pi 进行一些逆向工程。我正在将 Can Analyzer 的输出通过管道传输到 python 脚本。我的主要问题是“扩展”ascii 字符最终没有正确显示。

我按如下方式运行脚本:

./candump blablabla | python test.py

./candump 的结果是一个“十六进制”字符串,例如在这种情况下,“3631B043”应翻译为“61°C”。由于我在做逆向工程,我不知道使用的编码,我只知道度数符号(“B0”)只使用了 1 个字节。 “ü”符号(“FC”)也是如此。

当我在 pi 上的 python 中尝试一些事情(在谷歌搜索了很多之后)时,我终于成功地获得了正确的格式。但是我不知道它是如何工作的,当我在我的 python 脚本中尝试相同的操作时它不再工作了。这是尝试:

pi@raspberrypi /test/cant/can-test $ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> input = "3631B043"
>>> hex = input.decode("hex")
>>> len(hex)
4
>>> print hex
61▒C
>>> print hex.encode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 2: ordinal not in range(128)
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> print hex.encode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 2: ordinal not in range(128)
>>> sys.setdefaultencoding('latin1')
>>> print hex.encode('utf8')
61°C
>>>

有人可以解释这背后的原因以及为什么在使用管道时此选项不再起作用。谢谢

最佳答案

>>> print '3631B043'.decode('hex').decode('iso-8859-1')
61°C

第一个decode 将十六进制解码为字节。第二个 decode 使用 Latin-1(又名 ISO-8859-1)从字节转换为 Unicode。此时,您已经有了一个合适的 Unicode 字符串,如果您愿意,可以将其进一步编码为不同的编码。

关于linux - 在 python 2.7 中编码/解码特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28558424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com