使用Encoding.ANSI或Encoding.Unicode时获取Null-Terminated字符串

时间:2014-09-06 10:32:05

标签: c# .net character-encoding

我有一个 c#字符串,如下所示:

string a = "Hello";
  1. 如何使用Encoding类来获取字符的确切长度包括空终止字符?例如,如果我使用Encoding.Unicode.GetByteCount,我应该 12 ,如果我使用Encoding.ASCII.GetByteCount,我应该 6
  2. 如何使用Encoding类将字符串编码为字节数组,包括空终止字符
  3. 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

在.NET中,字符串不会以空值终止,因此如果您正在使用的协议需要一个字符串,则需要自己添加空字符。这意味着:

  1. 您需要手动为字符串长度添加1。
  2. 您需要手动将空字符(例如(byte)0)写入字节数组的末尾。

答案 1 :(得分:1)

据我所知,null-termination对于C / C ++的语言/平台来说是一个特定的东西。 Unicode和ANSI编码没有指定字符串为空终止的任何要求,C#/ CLR平台也没有。你不能指望它们包含那个额外的角色。因此,您可能很难让这些类从您的5个字符“Hello”字符串中发出。

但是,在C#/ CLR中,字符串可以包含空字符

因此,在此基础上,尝试转换以下这个6个字符的字符串

string a = "Hello\0";

string a = "Hello";
a += "\0"; // if you really can't have the \0 at first time, you can simply add it

我很确定你会通过Encoding.ANSI和Encoding.Unicode得到你想要的结果(ANSI中的单个\ 0,UTF中的单个\ 0,UTF16中的\ 0 \ 0等)。 p>

(另请注意,如果你是P / Invoking,那么你不需要手动处理.Mashaller将正确地终止字符串,假设数据类型集被认为是类似字符串的数据而不是数组 - 像数据一样。)