从其他文件编码转换错误中提取二进制文件

本文关键字:提取 二进制文件 错误 转换 其他 文件 编码 | 更新日期: 2023-09-27 18:33:27

我有两个二进制文件,"bigFile.bin""smallFile.bin"
"bigFile.bin"包含"smallFile.bin" .
打开它超越比较证实了这一点。

我想将较小的文件从较大的文件中提取为等于"smallFile.bin"的"结果.bin"。
我有两个关键字 - 一个用于起始位置("部分"(,一个用于结束位置("人"(;

我尝试了以下方法:

   byte[] bigFile = File.ReadAllBytes("bigFile.bin");
   UTF8Encoding enc = new UTF8Encoding();
   string text =  enc.GetString(bigFile);
   int startIndex = text.IndexOf("Section");
   int endIndex = text.IndexOf("Man");
   string smallFile = text.Substring(startIndex, endIndex - startIndex);
   File.WriteAllBytes("result.bin",enc.GetBytes(smallFile));

我试图将结果文件与 Beyond Compare 中的原始小文件进行比较,它显示了十六进制表示比较。
字节的nost是相等的 - 但有些不是。

例如,在新文件中我84,但在旧文件中,我EF BF BD序列。

什么会导致这些差异?我哪里弄错了?

从其他文件编码转换错误中提取二进制文件

由于您正在使用二进制文件,因此不应使用与文本相关的功能(包括编码等(。请改用与字节相关的方法。

您当前的代码可以通过将其转换为如下所示的内容来转换为工作:

   byte[] bigFile = File.ReadAllBytes("bigFile.bin");
   int startIndex = /* assume we somehow know this */
   int endIndex = /* assume we somehow know this */
   var length = endIndex - startIndex;
   var smallFile = new byte[length];
   Array.Copy(bigFile, startIndex, smallFile, 0, length);
   File.WriteAllBytes("result.bin", smallFile);

要找到startIndexendIndex,您甚至可以使用以前的技术,但这样的东西会更合适。

但是,这仍然是有问题的,因为:

  1. 将二进制数据和"文本"填充到同一个文件中会使事情复杂化
  2. 这里仍然有很多不必要的复制;你应该将输入作为Stream而不是字节数组来处理
  3. 比不必要的复制更糟糕的是,任何非流解决方案都需要像上面发生的那样将所有输入文件加载到内存中(浪费(,或者编码非常复杂

那么,该怎么办呢?

  1. 不要将内存中的文件内容读取为字节数组。请改用FileStream
  2. FileStream周围环绕一个StreamReader,并使用它来查找开始和结束索引的标记。更好的是,更改文件格式,这样就不需要搜索文本。
  3. 了解startIndexlength后,使用流函数查找输入流的相关部分,并将length字节复制到输出流。