Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StreamReader与MemoryStream.ToArray_C# - Fatal编程技术网

C# StreamReader与MemoryStream.ToArray

C# StreamReader与MemoryStream.ToArray,c#,C#,与使用StreamReader相比,为什么MemoryStream.ToArray在输出字符串的开头有一个额外的字符 public void StreamOutputTest() { var document = new XDocument( new XElement( "root" ) ); string actual1; string actual2; using( var stream = new MemoryStream() ) {

与使用
StreamReader
相比,为什么
MemoryStream.ToArray
在输出字符串的开头有一个额外的字符

public void StreamOutputTest()
{
    var document = new XDocument( new XElement( "root" ) );
    string actual1;
    string actual2;
    using( var stream = new MemoryStream() )
    {
        using( var writer = new StreamWriter( stream, Encoding.UTF8 ) )
        {
            document.Save( writer, SaveOptions.DisableFormatting );

            stream.Position = 0;

            using( var reader = new StreamReader( stream, Encoding.UTF8 ) )
            {
                actual1 = reader.ReadToEnd();
            }

            actual2 = Encoding.UTF8.GetString( stream.ToArray() );
        }
    }

    var expected = "<?xml version=\"1.0\" encoding=\"utf-8\"?><root />";
    Assert.AreEqual( expected, actual1 ); // succeeds
    Assert.AreEqual( expected, actual2.Substring( 1 ) ); // succeeds
    Assert.AreEqual( expected, actual2 ); // fails
}
public void StreamOutputTest()
{
var文档=新XDocument(新XElement(“根”));
字符串1;
字符串实际值L2;
使用(var stream=new MemoryStream())
{
使用(var writer=newstreamwriter(stream,Encoding.UTF8))
{
document.Save(writer,SaveOptions.DisableFormatting);
流位置=0;
使用(var reader=newstreamreader(stream,Encoding.UTF8))
{
actual1=reader.ReadToEnd();
}
actual2=Encoding.UTF8.GetString(stream.ToArray());
}
}
预期var=”;
Assert.AreEqual(预期,实际);//成功
Assert.AreEqual(应为,actual2.Substring(1));//成功
Assert.AreEqual(预期,实际);//失败
}

65279的额外字节值是以十六进制表示的
FEFF
,十六进制是UTF-16编码的字节顺序标记


请在此处阅读字节顺序标记:

的额外字节值
65279
FEFF
十六进制,这是UTF-16编码的字节顺序标记



请在此处阅读字节顺序标记:

额外字符的值是多少?字符串以C#结尾为null…我想这可能是一个字节顺序标记。@toadflakz额外的字符在字符串的开头,但它的值是65279,我假设这只是当时内存中的一个值。
actual1
actual2
的值是多少?@webber2k6我添加了另一个断言,以显示除第一个字符外的所有字符都与预期值匹配。额外字符的值是多少?字符串以C#结尾为null…我想这可能是一个字节顺序标记。@toadflakz额外的字符在字符串的开头,但它的值是65279,我假设这只是当时内存中的一个值。
actual1
actual2
的值是多少?@webber2k6我添加了另一个断言,以显示除第一个字符外的所有字符都与预期值匹配。谢谢。当流写入器为UTF-8时,为什么字节顺序标记为UTF-16?Tbh我不完全确定。正如您所说,
StreamWriter
正在使用正确的编码,除非
document.Save()
覆盖了该编码?发布的代码中存在一些不一致之处-例如,
StreamReader
在构造函数中没有显式编码。也就是说,经过实验,如果使用UTF7、UTF8或UTF32编码,字符串的
Encoding.XXX.GetString
版本在开始时具有UTF16 BOM,这似乎很奇怪!(ASCII不…)我想我们在这里被术语弄糊涂了。NET字符串默认为Unicode(UTF-16)afaik。读取方法(
GetString()
)读取UTF-8格式,而不是返回UTF-8编码的字符串。@DanPuzey谢谢。我已经修好了StreamReader。谢谢。当流写入器为UTF-8时,为什么字节顺序标记为UTF-16?Tbh我不完全确定。正如您所说,
StreamWriter
正在使用正确的编码,除非
document.Save()
覆盖了该编码?发布的代码中存在一些不一致之处-例如,
StreamReader
在构造函数中没有显式编码。也就是说,经过实验,如果使用UTF7、UTF8或UTF32编码,字符串的
Encoding.XXX.GetString
版本在开始时具有UTF16 BOM,这似乎很奇怪!(ASCII不…)我想我们在这里被术语弄糊涂了。NET字符串默认为Unicode(UTF-16)afaik。读取方法(
GetString()
)读取UTF-8格式,而不是返回UTF-8编码的字符串。@DanPuzey谢谢。我已经修好了StreamReader。