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