【问题标题】:How do I get bytes including a null termination char from a string? [duplicate]如何从字符串中获取包含空终止字符的字节? [复制]
【发布时间】:2018-07-17 13:02:52
【问题描述】:

你好 StackOverflowers,

我在某处读到 C# 字符串不是以空值结尾的。没问题!但我想知道方法:

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

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

如果是手动的话,我猜方法是:

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

数据是ASCII,不用担心编码。

【问题讨论】:

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

标签: c# string null byte termination


【解决方案1】:

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

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


我在某处读到 C# 字符串不是空终止的

正确。

MSDN:

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

操作:

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

不,它不需要,你也不需要,除非你当然希望通过 p-invoke 将字符串传递给 native code 但这是一个完全不同的问题(无论如何都由 .NET 为您处理)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      GetBytes 不添加空终止字符。根据this SO answer,您只需将char.MinValue 添加到字符串的末尾即可。

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

      【讨论】:

        【解决方案4】:

        来自MSDN

        您的 Unicode 应用程序在使用时应始终将零转换为 TCHAR 以 null 结尾的字符串。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-11
          相关资源
          最近更新 更多