python3中的十六进制解码列表

Decoding list of hex in python3

我有一个十六进制列表,我想将其转换为一个 unicode 字符列表。这里的一切都是用 python-3.5.

完成的

如果我这样做 print(binary.fromhex('hex_number').decode('utf-8')) 就可以了。但如果在转换后我再次存储列表中的字符,则不起作用:

a = ['0063'] # Which is the hex equivalent to the c char.
b = [binary.fromhex(_).decode('utf-8') for _ in a]
print(b)

将打印

['\x00c']

而不是

['c']

而代码

a = ['0063']
for _ in a:
    print(binary.fromhex(_).decode('utf-8'))

打印,预计:

c

有人可以向我解释如何将列表 ['0063'] 转换为列表 ['c'] 以及为什么我会有这种奇怪的(对我来说)行为吗?

要看0063十六进制对应的是什么看here.

你没有UTF-8数据,如果0063是U+0063 LATIN SMALL LETTER C. At best you have UTF-16 data,big endian顺序:

>>> binary.fromhex('0063').decode('utf-16-be')
'c'

您可能需要检查您的 完整 数据是否以 Byte Order Mark 开头,对于大端 UTF-16 来说是 'FEFF'十六进制,此时您可以删除 -be 后缀,因为解码器将知道要使用的字节顺序。如果您的数据以 'FFFE' 开头,那么您使用的是 little-endian 编码的 UTF-16,并且您在错误的位置分割了数据;在这种情况下,您为前面的代码点带走了 '00' 字节。

UTF-8 是一种 可变宽度 编码。 Unicode 标准中的前 128 个代码点(对应 ASCII 范围),直接编码为单个字节,直接映射到 ASCII 标准。 Latin-1 范围及以后的代码点(直到 U+07FF(*),下一个 1919 代码点)映射到两个字节,等等

如果您的输入确实是 UTF-8,那么在 'c' 之前确实有一个 \x00 NULL character。打印 NULL 会导致在许多终端上没有输出,但您可以使用 cat -v 将此类不可打印的字符转换为 caret escape codes:

$ python3 -c "print('\x00c')"
c
$ python3 -c "print('\x00c')" | cat -v
^@c

^@cat 使用的 caret notation 中 NULL 的表示。


(*) U+07FF 当前未在 Unicode 中映射;当前可能的最后一个 UTF-8 两字节代码点是 U+07FA NKO LAJANYALAN.

a = ['0063'] # Which is the hex equivalent to the c char.
b = [chr(int(x,16)) for x in a]
print(b)

感谢1