解码python3中的十六进制列表

时间:2017-10-09 08:10:42

标签: python string python-3.x unicode python-unicode

我有一个十六进制列表,我想将其转换为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

2 个答案:

答案 0 :(得分:2)

如果0063为U+0063 LATIN SMALL LETTER C,则您没有UTF-8数据。 充其量您有UTF-16 data,大端序:

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

您可能想要检查完整数据是否以Byte Order Mark开头,对于以十六进制为'FEFF'的大端UTF-16,此时您可以删除-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将此类不可打印字符转换为插入符转义码

$ 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

答案 1 :(得分:1)

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

感谢1