【问题标题】:BinaryReader overwhelming me by padding byte arrayBinaryReader 通过填充字节数组压倒我
【发布时间】:2013-05-18 20:28:22
【问题描述】:

所以我有这个非常简单的代码,它可以读取文件并以十六进制查看器的方式将其数据吐出。这里是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace HexViewer
{
    class Program
    {
        static void Main(string[] args)
        {
            BinaryReader br = new BinaryReader(new FileStream("C:\\dump.bin", FileMode.Open)); 
            for (int i = 0; i < br.BaseStream.Length; i+= 16)
            {
                Console.Write(i.ToString("x") + ": ");
                byte[] data = new byte[16];
                br.Read(data, i, 16);
                Console.WriteLine(BitConverter.ToString(data).Replace("-", " "));
            }
            Console.ReadLine();
        }
    }
}

问题是在第一次迭代之后,当我这样做时

br.Read(data, 16, 16);

字节数组填充16个字节,然后填充文件第15个字节到第31个字节的数据。因为它无法将 32 字节放入 16 字节的大数组中,所以它会引发异常。您可以对任何大于 16 字节的文件尝试此代码。那么问题来了,这段代码有什么问题呢?

【问题讨论】:

  • 我会说br.Read(data, i, 16) 中的i。这不应该是0吗?
  • 我同意@DeCaf。索引不是在要读取的数据中引用,而是在输出数组中的索引。在这种情况下,数据应始终写入输出数组的开头,因此值应为 0。
  • 谢谢!现在效果非常好!

标签: c# .net


【解决方案1】:

只需将br.Read(data, i, 16); 更改为br.Read(data, 0, 16);

您每次都在读取一个新的数据块,因此无需将i 用于data 缓冲区。

更好的是,改变:

byte[] data = new byte[16];
br.Read(data, 0, 16);

收件人:

var data = br.ReadBytes(16);

【讨论】:

  • 我.. 我不敢相信它奏效了。但是索引是从文件的开头开始的,并且 Read() 不使用 Stream.Position 对吗?对吗?
  • Read() 是否使用其内部流位置,因此您无需跟踪它。你只需要i 来记录你的控制台输出中的当前位置,就像你正在做的那样。
  • index 参数是要开始读取的数组中的第一个索引。
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 2015-08-16
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
相关资源
最近更新 更多