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

时间:2018-07-17 13:02:52

标签: c# string null byte termination

你好StackOverflowers

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

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

在数组末尾添加一个空终止符,或者是否必须手动执行? (将使用此数组的C系统确实需要它)。

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

byte[] myBytes = Encoding.ASCII.GetBytes(myString + '\0');

数据应为ASCII,无需担心编码。

4 个答案:

答案 0 :(得分:3)


  

在数组末尾添加一个空终止符,或者如果我必须手动将其终止

TL; DR -这取决于。对于纯.NET开发,您不需要它。 如果您打算对本地代码使用p调用,那么.NET可以为您很好地进行翻译,因此您也不必这样做。


  

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

正确。

MSDN:

  

字符串是String类型的对象,其值为文本。在内部,文本存储为Char对象的顺序只读集合。 C#字符串的末尾没有以null结尾的字符;因此,C#字符串可以包含任意数量的嵌入式空字符('\ 0')。字符串的// Get access to the native MongoDB client via the default Sails datastore. var db = sails.getDatastore("nameOfTheDatastore").manager; db.collection('user').find().toArray(console.log);属性表示它包含的Char对象的数量,而不是Unicode字符的数量。 -Tell me more...

OP:

  

但是我想知道方法Length是否有效   在数组的末尾添加一个空终止符,或者如果我必须手动将其添加

不是,您也不需要,除非您当然希望通过 p调用将字符串传递给本地代码,但这是一个完全不同的问题(无论如何,NET都会为您解决)。

答案 1 :(得分:2)

它没有添加,您的第二个代码将起作用。

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

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

答案 2 :(得分:0)

GetBytes不会添加空终止符。根据{{​​3}},您可以仅将char.MinValue添加到字符串的末尾。

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

答案 3 :(得分:0)

来自MSDN

  

您的Unicode应用程序在使用时应始终将零转换为TCHAR   空终止的字符串。

因此,要有一个以空字符结尾的字符串,我们必须在此代码的末尾添加一个字节。 byte的默认值为0

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