【问题标题】:Python - UnicodeDecodeError from byte address?Python - 来自字节地址的 UnicodeDecodeError?
【发布时间】:2013-10-30 20:13:00
【问题描述】:

我正在尝试解码从进程地址获得的字节数据。我知道使用 3rd 方软件字节地址的值是什么。我将字节数据检索到缓冲区(ctypes 中的 c_char_p 类型)。

然后使用buffer.value.decode() 我得到(#,而我希望得到值9000。我将值(使用第三方软件)更改为2000。一旦我这样做了,我得到了错误

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

在我看来,要么 UTF-8 是错误的编码,要么我做错了其他事情。我尝试将其解码为 Latin-1,但这也没有成功。有什么建议吗?

【问题讨论】:

  • 嗯,能把字节地址的值贴出来吗?
  • 尝试解码为 ctypes.c_int 或 ctypes.c_long?
  • @ChristianTernus:我在地址看到的值是(#,当它是 9000(根据第三方软件的十进制格式)和 `\xd0\x07' 假设它是2000.
  • @MarkkuK.:我会尽快尝试...
  • @MarkkuK.:嗯...快速浏览一下我不确定如何将其解码为 ctypes.c_int 或 ctypes.c_long。对此有何建议?

标签: python unicode python-3.x byte decode


【解决方案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

【讨论】:

  • 太棒了。我仍然在我的主代码中做错了其他事情,但这确实恢复了正确的值,所以我应该能够从那里修复它。 (哦,不过需要注意的是,您需要在c_char_p() 中的字符串之前放置一个b
  • 啊,我还在想python 2.7——那里没有区别。不过我会更新答案。
  • 好吧,是的,我使用的是 3.3。另外,我发现了我的另一个问题(只是在 ReadProcessMemory 之前有 memmove),所以现在一切正常。再次感谢!
猜你喜欢
  • 2017-11-05
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2012-05-07
  • 2013-10-13
  • 2015-02-03
相关资源
最近更新 更多