ASCII.GetString()在空字符处停止

我有很大的问题…我的代码:

string doc = System.Text.Encoding.ASCII.GetString(stream); 

变量doc以第一个空( /0 )字符结束(此时缺少大量数据)。 我想得到整个字符串。 更重要的是,当我复制这段代码并在Visual Studio的即时窗口中运行时 – 一切都很好……

我做错了什么?

不,它没有:

 string doc = System.Text.Encoding.ASCII.GetString(new byte[] { 65, 0, 65 }); // A\0A int len = doc.Length; //3 

但Winforms(和Windows API)在第一个\0时截断(显示时)。

示例: https : //dotnetfiddle.net/yjwO4Y

我将添加(在Visual Studio 2013中), \0在单个位置正确显示但是:如果激活文本可视化器(放大镜),则不支持\0并截断它。

为什么会这样? 因为历史上有两个“模型”用于字符串,C字符串是NUL\0 )终止(因此不能使用\0作为字符)和Pascal字符串有长度前置,所以可以有\0作为角色。 来自维基

以空值终止的字符串由PDP-11汇编语言的.ASCIZ指令和PDP-10的MACRO-10宏汇编语言的ASCIZ指令生成。 这些早于C编程语言的开发,但经常使用其他forms的字符串。

现在,Windows是用C语言编写的,并使用空终止字符串(但后来Microsoft改变了主意,COM字符串更类似于Pascal字符串并且可以包含NUL字符)。 所以Windows API不能使用\0字符(除非它们是基于COM的,并且可能经常基于COM可能是错误的,因为它们没有完全测试\0 )。 对于.NET,Microsoft决定使用类似于Pascal字符串和COM字符串的东西,因此.NET字符串可以使用\0

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