在 C# StringBuilder 字符串中包含空字符

Include null characters in C# StringBuilder string

我正在从 C# 方法调用 C 库函数;像这样:

[DllImport("libfoo.dll")]
public static extern int GetData(StringBuilder buffer);

它returns它放入缓冲区的字符数,并且有一个已知的最大字符数限制;所以它可以这样称呼:

StringBuilder sb = new StringBuilder(5000);

int received = GetData(sb);

所以problem/question:C函数使用字符数组作为字节数组;我们不一定要查看普通字符串,字符数组很可能包含空字符。

似乎 StringBuilder 的这种默认、天真的用法导致 C# 字符串在第一个空字符/空字节处被截断。

还能做什么?有没有办法强制 StringBuilder 接受带有空字符的字符串?或者有没有更好的访问C库函数的方法?

编辑:C 函数类似于:

int GetData (char *buffer);

如果您只想将 StringBuilder 转换为字符串数组,您总是可以这样做

var myArray = sb.ToString().Split('[=10=]');

ex(dotnetfiddler);

using System;
using System.Text;

public class Program
{
    public static void Main()
    {
        var sb = new StringBuilder();
        sb.Append("abc[=11=]def");

        Console.WriteLine(sb.ToString());
        var myArray = sb.ToString().Split('[=11=]');

        Console.WriteLine("myArray.Length " + myArray.Length);
        foreach(var a in myArray)
        {
            Console.WriteLine(a);
        }
    }
}

我还要补充一点,StringBuilder 确实支持空字符,上面的例子证明了这一点

好的,正如 Fredou 指出的那样,StringBuilder 字符串可以包含空字符,但在 C 代码和 C# 代码之间仍然遗漏了一些东西。事实证明,StringBuilder 通常是接收常规字符串的不错选择,但对于字节数组,使用字节数组效果更好。

在这里回答:PInvoke char* in C DLL handled as String in C#. Issue with null characters

在 C# 中使用字符串解释常规字节通常不是一个好主意。如果你知道它的最大大小,为什么不传递一个普通的字节数组呢?

[DllImport("libfoo.dll")]
public static extern int GetData([Out] byte[] buffer);