2013-10-30 25 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

相关问题