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
字符。