【问题标题】:Handling char* in C# (strlen function?)在 C# 中处理 char*(strlen 函数?)
【发布时间】:2012-04-11 19:41:02
【问题描述】:

我正在处理 C# 代码中的 char*(在不安全部分)。有什么方法可以从 C# 调用 strlen 函数。必须编写自定义 strlen 函数来搜索空终止符,这违反了所有常识。有没有办法从 C# 或我有权访问的类似方法调用 strlen?

总体而言,我正在尝试将 char* 转换为字符串对象,但字符是 ANSCII 格式,因此我将使用 .NET Encoding.Convert 命名空间进行转换。但在我这样做之前我需要知道字符串的长度。

【问题讨论】:

  • @dlev 我从 Scintilla 环境中得到这个 char*,所以我无法控制它。我没有直接得到长度,但我可以从其他一些东西中计算出来。我只是认为,如果他们让你处理 char*,那么一定有一种方法可以在 C# 中执行相当于 strlen 的操作。我知道我不是第一个想到这个的人。
  • char 是两个字节宽,所以如果你的char* 指向单字节数据,你可能根本找不到空终止符。

标签: c# c++ character-encoding strlen arrays


【解决方案1】:

Marshal.PtrToStringAnsi() 完全满足您的需求:

分配一个托管字符串并将所有字符复制到第一个 从存储在非托管内存中的字符串中提取空字符。

顺便说一句,该方法在指针上调用lstrlenA,实际上只是从kernel32.dll 导入。换句话说,not 似乎有一个可用的托管“让我知道这个非托管字符串的长度”的方法。

【讨论】:

  • +1 好点,但数据必须有一些空终止字符(它的存在不是强制性的)。需要检查这是否适用于 OP。
  • @Tigran OP 的要求假定存在空终止字符。他大概了解不良数据导致访问违规的风险。
  • @Tigran 我假设存在一个空终止符。如果有一种情况并非如此,我会很快了解,但显然总是如此。
猜你喜欢
  • 2011-06-28
  • 2010-12-25
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多