C# 如何从字符串中获取包含空终止字符的字节?

C# 如何从字符串中获取包含空终止字符的字节?,c#,string,null,byte,termination,C#,String,Null,Byte,Termination,各位好,飞越者 我在某处读到C#字符串不是以null结尾的。我很好!但我想知道这个方法是否: byte[] myBytes = Encoding.ASCII.GetBytes(myString); 在数组末尾添加一个空终止字符,或者如果我必须手动执行此操作?(将使用此数组的C系统确实需要它) 如果是手动的,我想方法是: byte[] myBytes = Encoding.ASCII.GetBytes(myString + '\0'); 数据应该是ASCII码,不用担心编码。 将空终止字符添加

各位好,飞越者

我在某处读到C#字符串不是以null结尾的。我很好!但我想知道这个方法是否:

byte[] myBytes = Encoding.ASCII.GetBytes(myString);
在数组末尾添加一个空终止字符,或者如果我必须手动执行此操作?(将使用此数组的C系统确实需要它)

如果是手动的,我想方法是:

byte[] myBytes = Encoding.ASCII.GetBytes(myString + '\0');
数据应该是ASCII码,不用担心编码。


将空终止字符添加到数组的末尾,或者如果必须手动添加,则添加空终止字符

TL;DR-视情况而定。纯.NET开发不需要它如果您打算对本机代码使用p-invoke,那么.NET会为您进行翻译,所以您也不会这样做


我在某个地方读到C#字符串不是以null结尾的

MSDN:

字符串是字符串类型的对象,其值为文本。在内部,文本存储为Char对象的顺序只读集合。C#字符串的末尾没有空终止字符;因此,C#字符串可以包含任意数量的嵌入空字符('\0')。字符串的
Length
属性表示它包含的字符对象的数量,而不是Unicode字符的数量。-

作品:

但是我想知道方法
byte[]myBytes=Encoding.ASCII.GetBytes(myString)
将空终止字符添加到数组的末尾,或者如果必须手动添加,则添加空终止字符


不,它不是,您也不需要,除非您当然希望通过p-invoke将字符串传递给本机代码,但这是一个完全不同的问题(并且由.NET为您处理)。

GetBytes
不会添加空终止字符。根据,您只需在字符串末尾添加
char.MinValue

byte[] myBytes = Encoding.ASCII.GetBytes(myString + char.MinValue);

它没有添加,您的第二个代码将工作

byte[] myBytes = 
         Encoding.ASCII.GetBytes("A"); // gives {65}

byte[] myBytes = 
    Encoding.ASCII.GetBytes("A"+"\0"); // gives {65, 0}

使用时,Unicode应用程序应始终将零强制转换为TCHAR 以null结尾的字符串

所以,要得到一个以null结尾的字符串,我们必须在代码的末尾添加一个字节。
byte
的默认值为
0

byte[] bytes= Encoding.Default.GetBytes(myString);
byte[] bytesNull = new byte[bytes.Length + 1];
bytes.CopyTo(bytesNull , 0);

如果您的问题本质上归结为“如何正确地将字符串封送到期望以null结尾的字符串的非托管代码?”那么您可以使用完全不同的选项和答案。您是否通过P/Invoke将其传递给非托管函数?因为如果是这样的话,很可能你做错了。。。如果正确声明P/Invoke,NUL字符将自动添加。