2016-07-13 185 views
1

這不是關於使用UTF-8的解碼。這是關於將字節對象作爲字面值讀取並將其作爲字節對象來讀取的,而不用重新進行解析過程。如果在那裏有我的問題的答案,它隱藏在許多有關解碼問題的答案背後。Python 3.4將字節字節字節轉換爲字節對象

以下是我需要:

x = "bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz')" 
y = ???(x, ???) 
z = bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz') 
if y == z: 
    print ("Yes!") 

如何以取代那些問號有什麼建議?

謝謝!

      -- Dave 
+2

修復產生'bytearray'文字的代碼可能會更容易,而不是產生更友好的東西。 –

回答

1

一種方法是從X(bytearray(b''))刪除所有的混亂,那麼我們就每個字符轉換爲其字節表示,並將其包裝成一個bytearray對象。

x = "bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz')" 
y = bytes(ord(c) for c in x[12:-2]) 

下面的第二種方法將不僅限於bytearray,您應該謹慎使用,以防止注射,但如果你確保你的內容是你可以使用這個正確的格式:

x = r"bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz')" 
y = eval(x) 
z = bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz') 

這裏您需要在x前加上r"..."以防止反斜線立即將unicode序列插入到x中。因此,可能無法將其與動態內容一起使用,例如字符串來自標準輸入或從文件讀取。

您還可以使用kindall建議的ast.literal_eval(x[10:-1])

+0

你也可以讓python把斜槓作爲文字斜線(而不是轉義),用'r'作爲整個字符串的前綴,就像在'x = r「bytearray(...)中一樣('r在這裏代表」Raw「上下文) – Delioth

+0

@Delioth謝謝,我不知道! – pascalhein

+2

如果你把它寫成'b'...'',你就可以使用'ast.literal_eval()'來獲得'bytes'對象,然後就調用'bytearray()'。 – kindall