簡體   English   中英

解碼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

有人可以向我解釋我如何轉換列表['c']的列表['0063'] ['c']以及為什么我會得到這種奇怪的(對我來說)行為?

要查看0063十六進制對應的內容,請查看此處

如果0063是U + 0063 LATIN SMALL LETTER C ,則沒有UTF-8數據。 充其量你有UTF-16數據 ,大端序:

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

您可能想檢查您的完整數據是否以字節順序標記開頭,對於以十六進制表示為'FEFF' big-endian UTF-16,此時您可以刪除-be后綴,因為解碼器將知道哪個字節為了使用。 如果您的數據以'FFFE'開頭,則您使用little-endian編碼的UTF-16,並將數據'FFFE'到錯誤的位置; 在這種情況下,您為前面的代碼點帶了'00'字節。

UTF-8可變寬度編碼。 Unicode標准中的前128個代碼點(與ASCII范圍對應)直接編碼為單個字節,直接映射到ASCII標准。 Latin-1范圍及更高范圍內的代碼點(直到U + 07FF (*) ,接下來的1919個代碼點)映射到兩個字節等。

如果您的輸入確實是UTF-8,那么在'c'之前你真的有一個\\x00 NULL字符 打印NULL會導致許多終端無輸出,但您可以使用cat -v將這些不可打印的字符轉換為插入轉義碼

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

^@cat使用的插入符號中 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM