【发布时间】:2015-12-29 06:34:49
【问题描述】:
我正在编写一个从档案中加载和提取文件的程序。目前使用我的代码,它成功地提取了我需要的档案之一,并且使用问题档案,它在给出异常之前读取并提取了 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 个文件和另一个没有问题的小存档。
【问题讨论】:
-
我建议阅读/查找文件格式规范。某些/所有文件中可能存在填充字节或其他一些额外数据。
-
这是一种专有格式,任何格式规范都是私有的,如果它仍然存在的话。未读取的 12 个字节是数据的一部分。 08 00 00 00 表示要读取 8 个字节,其余 8 个是数据。不过,我真的很感激这个建议,这是个好主意。
标签: c# .net io extraction binaryreader