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结尾的。