【问题标题】:Get an UTF-16 string length from memory in python从python中的内存中获取UTF-16字符串长度
【发布时间】:2016-02-19 01:49:45
【问题描述】:

我需要读取一个 utf-16 编码的字符串,该字符串存储在 LLDB 的 python 脚本的内存中。根据他们的文档,我可以使用ReadMemory(address, length, error),但我需要提前知道它的 length。 如果不是,python 的 decode 函数在偶然发现无法解码的字符时失败(即使使用 'ignore' 选项)并且进程停止:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u018e' in position 12: ordinal not in range(128)

任何人都可以提出实现这一目标的方法吗? (使用“python”或“lldb python”实现)。我没有原始字符串的长度。

谢谢。

【问题讨论】:

  • 你能显示你的代码吗?很高兴您显示错误,但请显示完整的回溯和引发错误的示例代码。
  • 在内存中表示字符串的方式有很多种。他们的文档有告诉你他们是怎么做的吗?
  • 这是一个内存转储示例或我需要解析的内容:(lldb) memory read 0x10142c838 0x10142c838: 61 00 62 00 63 00 64 00 65 00 00 00 00 00 00 00 a.b.c.d.e....... 0x10142c848: 00 00 00 00 00 00 00 00 8e 01 00 00 00 00 00 00 ................ 似乎是 UTF-16-le 编码的字符串。但我不确定它是否总是以空值终止。我希望这能提供更多的见解。

标签: python memory lldb string-length unicode-string


【解决方案1】:

字符串是否以 0 结尾?如果是这样,您可以一次读取 2 个字节,直到遇到 0x0000,然后您就会知道您有一个完整的字符串。

如果你这样做,你会想要给自己一个约束(例如,“我会在阅读后放弃 - 比如说 - 1MB 的数据”,以防你遇到损坏的内存)。

【讨论】:

  • 我也是这么想的,但显然没有定义空termination。有没有评估这个的函数?
  • 所以如果我理解,你的任务是读取一个长度你不知道且没有已知终止符的字符串?这是一个定义非常糟糕的问题。如果您的有效字符串后面跟着看起来像字符的垃圾怎么办?您是否可以接受过度激进的打印?字符串中的所有字符都可以打印吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多