BinaryReader未对齐 - 未读取正确的字节数

时间:2015-12-29 06:34:50

标签: c# .net io extraction binaryreader

我正在编写一个从存档中加载和提取文件的程序。目前使用我的代码,它成功地提取了我需要的一个档案,并且在问题档案库中,它在发出异常之前读取并提取了6个文件。

异常是因为它正在读取错误的整数,而是在它应该读取的整数之前读取整数12个字节。

这是我的代码:

if (versionNumber.Equals("AULB"))
{
    fileCount = binReader1.ReadInt32();

    for (int i = 0; i < fileCount; i++)
    {
        int size = binReader1.ReadInt32();
        String midValues = "" + binReader1.ReadInt64();
        int nameLength = binReader1.ReadInt32();

        String name = 
           System.Text.Encoding.Default.GetString(binReader1.ReadBytes(nameLength));

        byte[] blueprint = binReader1.ReadBytes((size) - 12 - nameLength);

        //Export blueprint for testing
        MemoryStream blueprintStream = new MemoryStream(blueprint);
        FileStream fileStream1 = new FileStream(
          "C:\\Users\\Dan\\Desktop\\blueprints\\" + i + ".blueprint", 
          FileMode.Create, FileAccess.Write);
        blueprintStream.WriteTo(fileStream1);
    }

作为一个快速解释,它正在读取4个字节以获取文件的大小,未使用的标头的8个字节(但我已将其设置为本地以进行潜在的有效性检查,因为此值应始终相同),然后4个字节来获取字符串名称的长度,然后读取那么多字节来获取名称。

之后,它抓取文件的剩余数据,因此我减去了名称的长度,字符串长度和额外的8个字节,因为它已经读取了它们。

为了说明我尝试加载的内容,这里是二进制数据。我用淡蓝色突出显示文件大小,浅绿色是额外的8个字节,亮绿色是字符串长度,然后粉红色是字符串。

我还在阅读中突出显示了我的程序试图读取的字节,认为它是文件大小。

我不太确定会导致此问题的原因,因为它会读取前6个文件和另一个没有问题的小档案。

The file I'm loading.

1 个答案:

答案 0 :(得分:0)

奇怪的是,经过一系列测试,给了我非常奇怪的值,这对于它正在读取的文件没有意义,我试图强制程序在到达第6个文件时读取12个额外字节,现在正在读取字节正确。

这是非常奇怪的,因为我尝试读取前面的字节,并且它们给了我的值,但是文件中不存在。

无论哪种方式,这都是为我修复它的代码。这是一个非常简单的解决方法。

if (i != 6)
{
    blueprint = binReader1.ReadBytes((size) - 12 - nameLength);
} else {
    blueprint = binReader1.ReadBytes((size) - 12 - nameLength + 12);
}