使用Encoding.ANSI或Encoding.Unicode时,获取Null终止字符串

本文关键字:Encoding 获取 Null 字符串 终止 ANSI Unicode 使用 | 更新日期: 2023-09-27 18:21:04

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

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

谢谢你的帮助!

使用Encoding.ANSI或Encoding.Unicode时,获取Null终止字符串

据我所知,null终止对于C/C++语言/平台来说是一件特殊的事情。Unicode和ANSI编码没有指定字符串以null结尾的任何要求,C#/CLR平台也没有。你不能指望他们包括那个额外的角色。因此,您可能很难让这些类从您的5个字符的"Hello"字符串中发出。

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

因此,在此基础上,尝试转换以下这个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中的single''0,UTF中的single''0UTF16等)得到你想要的结果

(另外,请注意,如果您是p/Invoking,则不需要手动处理。假设数据类型集被认为是类似字符串的数据,而不是类似数组的数据,Marshaller将正确地终止字符串。)

在.NET中,字符串不是以null结尾的,因此如果使用的协议需要null字符,则需要自己添加null字符。这意味着:

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