如何将简单字符串转换为以null结尾的字符串?
示例:
示例字符串:"测试消息"
以下是字节:
54 65 73 74 20 6D 65 73 73 61 67 65
我需要像下面这样的字节字符串:
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
我可以使用循环,但代码会很丑陋。如何使用原生方法进行此转换?
如何将简单字符串转换为以null结尾的字符串?
示例字符串:"测试消息"
以下是字节:
54 65 73 74 20 6D 65 73 73 61 67 65
我需要像下面这样的字节字符串:
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
看起来您需要一个以空字符结尾的Unicode字符串。如果该字符串存储在变量str
中,那么这应该可以正常工作:
var bytes = System.Text.Encoding.Unicode.GetBytes(str + "\0");
(查看运行结果。)
需要注意的是,生成的数组最后会有三个零字节。这是因为Unicode使用两个字节来表示字符。第一个零是原始字符串中最后一个字符的一半,接下来的两个零是Unicode编码空字符'\0'
的方式。(换句话说,我的代码比你最初指定的多了一个空字符,但这可能是你实际想要的。)
(s + "\0")
相同的结果。大多数情况下,对于任何编码 X
,Encoding.X.GetString(Encoding.X.GetBytes(s)) == s
。 - cdhowies = s + "\0"
...但这不会将字符串与Unicode NUL字符交错,我怀疑你也不想要那样。但你需要在这里提供更多上下文。 - Jon Skeetstring content = "This is a message!" + '\0';
这将给你一个以空终止符结尾的字符串。重要的是,空字符是不可见的,不会出现在任何输出中,它只会在调试窗口中显示。当你将字符串转换为字节数组(用于保存到磁盘和其他IO操作)时,它也会存在其中。但如果你执行Console.WriteLine(content)
,它就不可见了。
你应该明白为什么需要这个空终止符,以及为什么要避免使用循环结构来获取所需内容。在c#中,除非你最终要转换为字节数组,否则空终止符对于字符串而言是相当无用的。通常你只会在想要将字符串发送到本机方法、网络或usb设备时才这样做。
同样重要的是要意识到你如何获得字节。在C/C++中,char作为1字节(8位)存储,编码为ANSI。在C#中,编码为Unicode,占用两个字节(16位)。Jon Skeet 的回答展示了如何在Unicode下获取字节。
试试这个:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace stringlulz
{
class Program
{
static void Main(string[] args)
{
string original = "Test message";
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(original + '\0');
var output = bytes.Aggregate(new StringBuilder(), (s, p) => s.Append(p.ToString("x2") + ' '), s => { s.Length--; return s; });
Console.WriteLine(output.ToString().ToUpper());
Console.ReadLine();
}
}
}
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 00
strCmd = @"<?xml version=""1.0"" encoding=""utf-8""?><Command name=""SerialNumber"" />";
sendB = System.Text.Encoding.UTF8.GetBytes(strCmd+"\0");
sportin.Send = sendB;
Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(s + "\0"))
。不过它确实能正常工作。 - Johnson