c# - C# - 从内存地址读取字符串时,我如何知道读取字符串的正确长度?
问题描述
所以我有一个问题:我正在从不同时间不同的内存地址读取字符串。例如:
Axe?ca Ocarina?tar??ing?ing????????????
我只需要斧头。
Ball of Green Yarn??ing?ing????????????
我只需要绿纱球。
我正在读取 80 个字节的文本(40 个字符),因为这是字符串应该达到的最多字符数。但是我怎么知道这个字符串实际上有多长呢?
解决方案
这实际上取决于写入字符串的内容。
通常,字符串是以 NUL 结尾的,即'\0'
紧跟在字符串后面的字符。旧式(非_s
变体) C 函数喜欢strlen
并strcat
使用它来确定现有字符串的结尾并标记修改字符串的结尾。
大多数字符串数据类型倾向于以这种方式工作,但不是全部。在 Turbo Pascal 中,字符串是以长度为前缀的。 BSTR
在 COM(包括 pre-.NET VB)中使用的 s 都是。
根据您展示的示例,?
您在想要的部分之后看到的字符很有可能是 NUL 字符。看起来缓冲区每次都被重用和重新终止,例如像“Axe”这样的较短字符串被写在像某种陶笛这样的较长字符串上。
检查调试器中的缓冲区,您可能会发现'\0'
紧跟在您想要的字符后面的字符。
大概。 同样,这取决于写入字符串的内容。在您自己寻找之前,它可能是任何东西,即便如此,这一次它以 NUL 终止可能只是一个巧合。不要仅仅依靠观察。如果没有文档,它可能会有所不同,但仍然同样有效。 无论你做什么,都不要读过去你知道你有的 40 个字符的缓冲区,NUL 终止与否。
推荐阅读
- r - renderPlot 在视图中输出绘图,而不是浏览器
- c++ - 具有参数的模板的特化
- python - 为什么静音命令在 Discord.py 中不起作用?
- mysql - django.db.utils.OperationalError 1101. JSON 列不能有默认值
- python - 如何暂停、恢复和停止 pyttsx3 说话?
- bash - 如何通过 SSH 连接到远程服务器并 cd 一步进入源目录 - BASH
- javascript - POST http://localhost:4200/ 404 未找到(从 Angular 到 Nodejs 的请求)
- spring-boot - 如何使用 Spring Boot 中编码的 Soap Rpc?
- python - 仅使用第一次出现的字母的字符串的最小窗口
- java - Java Stream API 查找包含字符列表的单词