如何将字符串转换为以null结尾的字符串?

use*_*990 2 c# string data-conversion

如何将简单的字符串转换为以null结尾的字符串?

例:

示例字符串:"测试消息"
以下是字节:

54 65 73 74 20 6D 65 73 73 61 67 65
Run Code Online (Sandbox Code Playgroud)

我需要字符串,如下所示:

54 00 65 00 73 00 74 00 20 00 6D 00 65 00 73 00 73 00 61 00 67 00 65 00 00
Run Code Online (Sandbox Code Playgroud)

我可以使用循环,但代码太难了.如何通过本机方法进行此转换?

cdh*_*wie 12

看起来你想要一个以null结尾的Unicode字符串.如果字符串存储在变量中str,这应该有效:

var bytes = System.Text.Encoding.Unicode.GetBytes(str + "\0");
Run Code Online (Sandbox Code Playgroud)

(见它跑.)

请注意,结果数组的末尾将包含三个零字节.这是因为Unicode使用两个字节表示字符.第一个零是原始字符串中最后一个字符的一半,接下来的两个是Unicode如何编码空字符'\0'.(换句话说,使用我的代码有一个额外的空字符比你最初指定的,但这可能是你真正想要的.)

  • @ user2264990您要求输入字节.C#中的字符串包含字符,而不是字节.请消除您的问题歧义.对*为什么*你需要这个的一些解释会有所帮助. (4认同)
  • @ user2264990:是的,那太难看了.如果你只想要字符串,只需使用`s = s +"\ 0"`...但是这不会将字符串与Unicode NUL字符交错,我怀疑你无论如何都不想要它.但是你需要在这里提供更多背景信息. (2认同)

Gus*_*dor 6

关于c#字符串的一点背景是一个很好的起点.

C#字符串的内部结构与C字符串不同.a)它是unicode,因为它是'char'b)它不是空终止的c)它包含许多你需要的C/C++中的实用函数.

如何在没有空终止的情况下逃脱?简单!在内部,C#String管理一个char数组.C#数组是结构,而不是指针(如在C/C++中).因此,他们知道自己的长度.C/C++中的Null终止是必需的,因此像strcmp()这样的字符串实用程序函数能够检测内存中字符串的结尾.

空字符确实存在于c#中.

string content = "This is a message!" + '\0';
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个以null终止符结尾的字符串.重要的是,null字符是不可见的,不会出现在任何输出中.它将显示在调试窗口中.当您将字符串转换为字节数组(用于保存到磁盘和其他IO操作)时,Console.WriteLine(content)它也会出现,但如果这样做,将不可见.

您应该理解为什么要使用null终止符,以及为什么要避免使用循环结构来获取所需内容.除非您最终转换为字节数组,否则空终止字符串在c#中相当无用.通常,只有当您想将字符串发送到本机方法,网络或USB设备时,才会这样做.

了解如何获取字节也很重要.在C/C++中,char存储为1个字节(8位),编码为ANSI.在C#中,编码是unicode,它是两个字节(16位).Jon Skeet的答案向您展示了如何获取unicode中的字节.