首页 > 解决方案 > C# - 从内存地址读取字符串时,我如何知道读取字符串的正确长度?

问题描述

所以我有一个问题:我正在从不同时间不同的内存地址读取字符串。例如:

Axe?ca Ocarina?tar??ing?ing????????????

我只需要斧头。

Ball of Green Yarn??ing?ing????????????

我只需要绿纱球。

我正在读取 80 个字节的文本(40 个字符),因为这是字符串应该达到的最多字符数。但是我怎么知道这个字符串实际上有多长呢?

标签: c#intptrreadprocessmemory

解决方案


这实际上取决于写入字符串的内容。

通常,字符串是以 NUL 结尾的,即'\0'紧跟在字符串后面的字符。旧式(非_s变体) C 函数喜欢strlenstrcat使用它来确定现有字符串的结尾并标记修改字符串的结尾。

大多数字符串数据类型倾向于以这种方式工作,但不是全部。在 Turbo Pascal 中,字符串是以长度为前缀的。 BSTR在 COM(包括 pre-.NET VB)中使用的 s 都是。

根据您展示的示例,?您在想要的部分之后看到的字符很有可能是 NUL 字符。看起来缓冲区每次都被重用和重新终止,例如像“Axe”这样的较短字符串被写在像某种陶笛这样的较长字符串上。

检查调试器中的缓冲区,您可能会发现'\0'紧跟在您想要的字符后面的字符。

大概。 同样,这取决于写入字符串的内容。在您自己寻找之前,它可能是任何东西,即便如此,这一次它以 NUL 终止可能只是一个巧合。不要仅仅依靠观察。如果没有文档,它可能会有所不同,但仍然同样有效。 无论你做什么都不要读过去你知道你有的 40 个字符的缓冲区,NUL 终止与否。


推荐阅读