C# ASCII.GetString()在空字符上停止

C# ASCII.GetString()在空字符上停止,c#,ascii,C#,Ascii,我有个大问题。。。 我的代码: string doc = System.Text.Encoding.ASCII.GetString(stream); 变量doc以第一个空(/0)字符结尾(此时缺少大量数据)。我想要整根绳子。 而且,当我复制这段代码并在VisualStudio的即时窗口中运行时,一切都很好 我做错了什么?不,没有: string doc = System.Text.Encoding.ASCII.GetString(new byte[] { 65, 0, 65 }); // A\

我有个大问题。。。 我的代码:

string doc = System.Text.Encoding.ASCII.GetString(stream);
变量
doc
以第一个空(
/0
)字符结尾(此时缺少大量数据)。我想要整根绳子。 而且,当我复制这段代码并在VisualStudio的即时窗口中运行时,一切都很好

我做错了什么?

不,没有:

string doc = System.Text.Encoding.ASCII.GetString(new byte[] { 65, 0, 65 }); // A\0A
int len = doc.Length; //3
但是Winforms(和Windows API)一开始会截断(在显示时)
\0

例如:

我要补充一点(在Visual Studio 2013中),
\0
是正确显示的,但只显示在一个位置:如果激活文本可视化工具(放大镜),则该工具不支持
\0
,并将其截断

为什么会发生这种情况?因为历史上有两种字符串“模型”,C字符串以
NUL
\0
)结尾(因此不能将
\0
用作字符),Pascal字符串以长度为前缀,因此可以将
\0
用作字符。从

以Null结尾的字符串由PDP-11汇编语言的.ASCIZ指令和PDP-10宏汇编语言的MACRO-10宏汇编语言的ASCIZ指令生成。这些字符串早于C编程语言的发展,但通常使用其他形式的字符串

现在,Windows是用C编写的,并且使用以null结尾的字符串(但是微软改变了主意,COM字符串更类似于Pascal字符串,可以包含NUL字符)。因此,Windows API不能使用
\0
字符(除非它们是基于COM的,而且基于COM的可能经常有问题,因为它们没有针对
\0
进行全面测试)。对于.NET,Microsoft决定使用类似于Pascal字符串和COM字符串的内容,因此.NET字符串可以使用
\0


Winforms直接构建在Windows API之上,因此它无法显示
\0
。WPF是在.NET中“从头开始”构建的,因此通常它可以显示
\0
字符。

什么是
确切地说?流只是字节数组正如您所期望的字节数组的长度?这个重载不存在吗:System.Text.Encoding.ASCII.GetString(byte[]bytes,int byteIndex,int byteCount)其中bytes是要读取的字节数组,byteIndex是要开始读取的字节的索引,byteCount是要读取的总字节数?将其与byteIndex=0和byteCount=stream.length一起使用。我也使用过此重载。结果与前面的相同。它是特定于.net framework的函数,而不是WPF。它的行为始终与您描述的一样。WPF的数据绑定到控件时,实际上会显示空字符。此外,在dotnetfiddle示例中,也没有截断的内容。在输出中跳过空字符。但它仍然显示
AA
(也许“截断”是错误的词?。@poke是的。。。并测试了WPF。。。通过标签、文本框和按钮,
\0
显示为“缺少字符”方块。显然,您不能在窗口的标题中使用它,因为标题是由Windows@Aik事实上,情况正好相反。NET框架确实可以处理
\0
很好,但互操作代码不能处理。所有
string
方法都能正常工作,这一点很容易证明——您可以
IndexOf('\0')
Substring
Split('\0')
。。。当您必须将字符串转换为以null结尾的字符数组时,就会出现问题-显然,第一个
'\0'
之后的所有内容都被忽略了。这是对以null结尾的字符串的限制,而不是.NET-.NET的字符串不是以null结尾的。