我有這個序列,我必須解碼它,作為 Python 和編碼的完整初學者。
enc = b'\x80\x03}q\x00(K\x01K\x01K\x02K\x03K\x03K\x06K\x04G?\xc5UUUUUUK\x05G?\xe0\x00\x00\x00\x00\x00\x00K\x06G?\x9cq\xc7\x1cq\xc7\x1cK\x07G?\xc5UUUUUUK\x08K$K\tG?\xb5UUUUUUK\nK\x07K\x0bG?\xe5UUUUUUK\x0cG?\xb5UUUUUUK\rG?\xedUUUUUUK\x0eK4K\x0fG?\xb3\xb1;\x13\xb1;\x14K\x10K\x00K\x11G?\xcd\x89\xd8\x9d\x89\xd8\x9eK\x12G?\xcb\x9b\x9b\x9b\x9b\x9b\x9cK\x13G?\xa4\x14\x14\x14\x14\x14\x14K\x14X\x08\x00\x00\x00discretaq\x01K\x15K\x02K\x16X\x02\x00\x00\x00daq\x02K\x17G?\xe4z\xe1G\xae\x14{K\x18G@\x15\x00\x00\x00\x00\x00\x00K\x19G?\xe4z\xe1G\xae\x14|K\x1aK2K\x1bK\x01K\x1cK\x03K\x1dG?\xd5UUUUUUK\x1eG?\xc5UUUUUUK\x1fK\x01K K\x04K!G?\xaf\xf2\xe4\x8e\x8aq\xdeK"K\x04K#X\x04\x00\x00\x00mareq\x03u.'
我試過這樣做
strputere = enc.decode()
print(strputere)
我得到一個錯誤
File "encode.py", line 4, in <module>
strputere = enc.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
我開始做一些研究,我發現 b 代表位元組。
所以我的 enc 變數是一個位元組字串文字。我研究了 .decode() ,它似乎是一個不錯的選擇 - 但可能不是。
我有點困惑,因為它是一個位元組字串文字,但它包含一些我認為它們是 UTF-8 字符的字符(例如 \x80)。
那么,我該如何解碼它,以及它的演算法是什么?我很想知道會發生什么,我做了我的研究,但我有點迷茫,我需要一些幫助。
uj5u.com熱心網友回復:
所以,通常當你有一個位元組序列時,你有兩種不同的方法來處理它,具體取決于內容:
- 是純字串序列嗎?
如果處理純字串序列,則需要使用以下內容進行解碼:
enc.decode("utf-8")
請記住,在這種情況下,您必須知道使用了什么編碼(此處為 utf-8)。但是根據您收到的錯誤訊息,它似乎不正確。秒
如果你不知道編碼但你知道它絕對是一個字串編碼,你可以看看這個問題中提到的選項here
- 傳感器/其他輸入
如果您使用的是嵌入式設備,或任何可能包含一系列資料的位元組輸入,而不僅僅是一個欄位,則必須使用struct.unpack(). 這有點復雜,您需要瀏覽檔案才能找到必須用于解碼的確切字串。
它的作業方式是告訴 python 每個位元組是什么(字串、整數等)以及每個位元組的長度,它會將其轉換為物件元組,如下所示:
values = list(struct.unpack('>BBHBBhBHhHL', enc))
uj5u.com熱心網友回復:
這些資料是使用 pythonpickle模塊編碼的。你可以這樣解碼:
>>> import pickle
>>> numbers = pickle.loads(enc)
>>> print(numbers)
{1: 1, 2: 3, 3: 6, 4: 0.16666666666666666, 5: 0.5, 6: 0.027777777777777776, 7: 0.16666666666666666, 8: 36, 9: 0.08333333333333333, 10: 7, 11: 0.6666666666666666, 12: 0.08333333333333333, 13: 0.9166666666666666, 14: 52, 15: 0.07692307692307693, ...
uj5u.com熱心網友回復:
發生錯誤是因為字串包含使用 utf-8 無法解碼的非 ASCII 字符。
它只是隨機資料還是使用某種特定編碼進行編碼?使用“unicode_escape”解碼確實有效,但輸出似乎沒有那么有用。
enc.decode("unicode_escape")
回傳:
'\x80\x03}q\x00(K\x01K\x01K\x02K\x03K\x03K\x06K\x04G??UUUUUUK\x05G?à\x00\x00\x00\x00\x00\x00K\x06G?\x9cq?\x1cq?\x1cK\x07G??UUUUUUK\x08K$K\tG?μUUUUUUK\nK\x07K\x0bG??UUUUUUK\x0cG?μUUUUUUK\rG?íUUUUUUK\x0eK4K\x0fG?3±;\x13±;\x14K\x10K\x00K\x11G?í\x89?\x9d\x89?\x9eK\x12G??\x9b\x9b\x9b\x9b\x9b\x9cK\x13G?¤\x14\x14\x14\x14\x14\x14K\x14X\x08\x00\x00\x00discretaq\x01K\x15K\x02K\x16X\x02\x00\x00\x00daq\x02K\x17G??záG?\x14{K\x18G@\x15\x00\x00\x00\x00\x00\x00K\x19G??záG?\x14|K\x1aK2K\x1bK\x01K\x1cK\x03K\x1dG??UUUUUUK\x1eG??UUUUUUK\x1fK\x01K K\x04K!G?ˉò?\x8e\x8aqTK"K\x04K#X\x04\x00\x00\x00mareq\x03u.'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315084.html
