C# 0值的System.Text.Encoding.Default.GetString(字节[])结果

C# 0值的System.Text.Encoding.Default.GetString(字节[])结果,c#,.net,string,character-encoding,bytearray,C#,.net,String,Character Encoding,Bytearray,当将字节数组转换为字符串时,我使用的是类似这样的东西 byte[] src = new byte[5] { 65, 66, 67, 0, 0 }; string s = System.Text.Encoding.Default.GetString(src); 另请参见此处: 但是,如果字节数组在某些位置(例如末尾)包含值0,因为预期字符串不够长,则生成的字符串还包含“\0”字符。它们甚至可以算作string.Length。上述示例的结果为ABC\0\0,长度为5 这样一个字符串是可打印的,但C

当将字节数组转换为字符串时,我使用的是类似这样的东西

byte[] src = new byte[5] { 65, 66, 67, 0, 0 };
string s = System.Text.Encoding.Default.GetString(src);
另请参见此处:

但是,如果字节数组在某些位置(例如末尾)包含值0,因为预期字符串不够长,则生成的字符串还包含“\0”字符。它们甚至可以算作string.Length。上述示例的结果为ABC\0\0,长度为5

这样一个字符串是可打印的,但Console.Writeline似乎在这样一个字符串后面的换行符上有问题。由于隐藏的“\0”字符ABC!=ABC\0\0


由于我当前仅将其用于调试输出,因此我的解决方法是修剪尾随“\0”字符。有没有更好的方法来消除这个问题,可能是不同的编码器或不同的转换方法?

那么,为什么不在转换为字符串之前直接从数组中丢弃这些\0呢? C中的字符串不是以null结尾的,因此没有理由保留任何\0

例如,通过使用Linq:

string s = System.Text.Encoding.Default.GetString(src.Where(x => x != 0).ToArray());

那么,为什么不在转换为字符串之前直接从数组中扔掉这些\0呢? C中的字符串不是以null结尾的,因此没有理由保留任何\0

例如,通过使用Linq:

string s = System.Text.Encoding.Default.GetString(src.Where(x => x != 0).ToArray());

只是可以简单地附加.TrimEnd'\0'是的,我已经说过了。而且它不适用于字符串中的\0。请看这里,您可以简单地附加.TrimEnd'\0'是的,我已经说过了。而且它不适用于字符串中的\0。请参见此处是,当然。问题是:是否有一个编码器已经在这样做?因为它已经处理了字节数组。默认编码器和ASCII编码器都尝试了这种不太标准的返回字符串,因为它们可能包含0,甚至在Strug.cPTP的中间。显然,如果我现在理解了,显然不确定。在将此数组编码为字符串之前,是否正在尝试清除源数组中任何位置的0字节?如果是,我已经向您展示了一种可能的方法。或者你想完成其他任务?我需要从公元前\0BC获得一个如何获得它的答案?@AndreiKrasutski这取决于你的确切要求。如果在第一次出现\0字符之前需要严格的字符,可以使用string.IndexOf和string.Substring或类似的名称。是的,当然可以。问题是:是否有一个编码器已经在这样做?因为它已经处理了字节数组。默认编码器和ASCII编码器都尝试了这种不太标准的返回字符串,因为它们可能包含0,甚至在Strug.cPTP的中间。显然,如果我现在理解了,显然不确定。在将此数组编码为字符串之前,是否正在尝试清除源数组中任何位置的0字节?如果是,我已经向您展示了一种可能的方法。或者你想完成其他任务?我需要从公元前\0BC获得一个如何获得它的答案?@AndreiKrasutski这取决于你的确切要求。如果在第一次出现\0字符之前需要严格的字符,可以使用string.IndexOf和string.Substring或类似的名称。