2013-10-30 28 views
0

我試圖解碼從一個進程的地址得到的字節數據。我知道使用第三方軟件的字節地址的值是什麼。我將字節數據檢索到一個緩衝區中(從​​開始,類型爲c_char_p)。Python - 來自字節地址的UnicodeDecodeError?

然後使用buffer.value.decode()我得到(#回來時,我期望得到的價值9000我的值(使用第三方軟件)變更爲2000年有一次,我這樣做,我得到了錯誤

UnicodeDecodeError: 'utf-8' can't decode byte 0xd0 in position 0: invalid continuation byte 

它在我看來,UTF-8是錯誤的編碼,或者我在做其他的錯誤。我嘗試將它解碼爲Latin-1,但這也是不成功的。有什麼建議麼?

+0

哼的小端表示,可以爲您發佈字節地址的值? –

+0

嘗試解碼爲ctypes.c_int或ctypes.c_long? –

+0

@ChristianTernus:我在地址上看到的值是'(#',當它是9000(根據第三方軟件的十進制格式)和'\ xd0 \ x07'當它假設爲2000時。 – golmschenk

回答

1

「\ XD0 \ X07」是2000

>>> import ctypes 
>>> ptr = ctypes.c_char_p(b'\xd0\x07') 
>>> val = ctypes.c_int() 
>>> ctypes.memmove(ctypes.byref(val),ptr,ctypes.sizeof(val)) 
>>> val.value 
2000 
+0

太棒了,我在主代碼中仍然做了一些其他的錯誤,但是它確實恢復了正確的值,所以我應該可以從那裏修復它(哦,但是就像一個註釋,你需要把一個'在c_char_p()'中的字符串之前的b') – golmschenk

+0

啊,我仍然在Python 2.7中考慮 - 它沒有什麼區別,我會更新答案 –

+0

好吧,是的,我正在使用3.3。我想出了我的另一個問題(只是在ReadProcessMemory之前有了memmove),所以平平淡淡現在工作很好。再次感謝! – golmschenk

相關問題