BinaryReader返回错误的位置

时间:2016-11-24 11:12:59

标签: c# android xamarin xamarin.android

我正在通过二进制阅读器将文件作为流读取。我读了很多字节,但是当检查基本流位置时,它比它应该的长得多。

代码示例:

public void MainLoader()
{
    FileStream input = System.IO.File.Open(path, System.IO.FileMode.Open);
    BinaryReader binaryReader = new BinaryReader(input, Encoding.GetEncoding(1252));
    byte[] bytes = binaryReader.ReadBytes(256); // 256 bytes
    binaryReader.ReadInt32(); //4 bytes
    binaryReader.ReadInt32(); //4 bytes
    binaryReader.ReadInt16(); //2 bytes
    binaryReader.ReadInt32(); //4 bytes
    binaryReader.ReadInt16(); //2 bytes
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadBoolean(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadInt16(); //2 bytes
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadBoolean(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadInt16(); //2 bytes
    binaryReader.ReadInt16(); //2 bytes
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    binaryReader.ReadByte(); // 1 byte
    // should return 292
    var position = binaryReader.BaseStream.Position
    binaryReader.Close();
}

当通过winform应用程序运行时,它按预期工作,postion为292.当通过Xamarin.Android应用程序运行时,它会混乱并返回4096.

我尝试过使用默认编码和UTF8编码而没有任何变化。我开始怀疑它是否落到某个CultureInfo设置

当代码物理读取292个字节时,流如何到达此位置?

1 个答案:

答案 0 :(得分:1)

对于使用DevExpress Coderush且已打开Debug Visualizer的任何人,这将自动检查使用流的代码的结果,例如BinaryReader,当执行实际的行时,该结果会导致流在错误的位置。在我的情况下(也是Xamarin.Android应用程序),我正在使用二进制读取器读取流中的所有字节,并且当我尝试对代码进行调试时,自动检查会移动位置并导致“无法读取”直到我在阅读序列中走得更远时为止。

对于Coderush用户而言,唯一的解决方法是关闭Debug Visualizer或确保在启用时不中断和逐步执行使用流的代码行。