在 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=]');
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);
我正在从 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=]');
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);