【问题标题】:Editing a binary file in java在java中编辑二进制文件
【发布时间】:2020-03-21 04:36:03
【问题描述】:

我需要做这个项目,我从中读取一个二进制文件,然后创建一个新的二进制文件,根据偏移量添加 00。因此,例如,如果二进制数位于偏移量 02,它将将该二进制数移动 2。因此该二进制数将位于 04. 与 00 之间。

我正在考虑使用随机访问文件来访问和编辑(只读)。但是我迷失了你要寻找多少字节。另外,如何编辑并将修改放入一个全新的文件中。

最诚挚的问候

【问题讨论】:

  • 请更准确地描述您的描述:您是否尝试通过在特定字节偏移处添加 字节值 0x00 来转移内容?如果是这样,我不确定问题出在哪里。您读取二进制数据,然后如果您选择的数据结构允许插入元素,请执行此操作。否则,您可以通过创建一个新的值列表list[:n] + (new value) + list[n+1:],在您需要的任何n“插入”一个元素
  • @Mike'Pomax'Kamermans 感谢您的回复。我在 java 中这样做,我刚刚创建了一个随机访问文件,但我不知道我应该使用 .seek(n) 方法查找它多少。我对此感到困惑。抱歉,我是这方面的初学者。
  • @Mike'Pomax'Kamermans 我不熟悉这些十六进制格式
  • @Mike'Pomax'Kamermans 您的列表示例在 Python 中,但标签是 java。
  • @KingA 要做你想做的事,你需要在一个文件中读取并在你写到另一个文件时修改它。根据您的描述,如果您有 10 个字节要插入某处,您将读取插入点并写出这些值。然后写出这 10 个字节并继续以相同的方式进行读取和写入。

标签: java binaryfiles


【解决方案1】:

在上图中。蓝色(0x54) 的第一个字节位于0x40 + 0x0E。添加左行值加上列值。因此,您必须阅读所有内容,但不包括该字节。所以这将抵消0x40 + 0x0D。那将是64 + 13 = 77。由于偏移量从0 开始,读入第一个78 字节,然后写出你想要的。然后写出文件的其余部分。这意味着在您进行特殊插入后,所有蓝色都将被写入。

这都是假设,这就是你想要做的。但是您不能真正使用seek,因为这意味着您正在修改不明智的源文件(因为您可能会犯错误并需要重新开始)。由于文件的大小可能会不断变化,因此寻找正在修改的文件可能会非常有问题。无论如何,请确保您保留该文件的备份副本。

要进行进一步修改,请按照说明继续阅读和写作。

这是一个蛮力示例。它可以通过适当的资源尝试和循环来改进。假定异常受到监视。此示例只是在指定位置插入两个整数三元组,然后打印新文件。

      // create a file to start
      FileOutputStream fo = new FileOutputStream("myfile.txt");
      String alpha = "abcdefghijklmnopqrstuvwxyz";
      fo.write(alpha.getBytes());
      fo.close();

      // create the new output file and open up the old one as an input
      // file
      fo = new FileOutputStream("myfile2.txt");
      FileInputStream fi = new FileInputStream("myfile.txt");
      // insert 123 after k
      byte[] buf = new byte[100];
      int count = fi.read(buf, 0, 11); // read up to and including k
      fo.write(buf, 0, count);
      fo.write("123".getBytes());
      // insert 456 after t
      count = fi.read(buf, 0, 9);
      fo.write(buf, 0, count);
      fo.write("456".getBytes());
      //copy rest of input file to output file
      while ((count = fi.read(buf, 0, 10)) > 0) {
         fo.write(buf, 0, count);
      }
      fo.close();
      fi.close();

      fi = new FileInputStream("myfile2.txt");
      byte[] buffer = fi.readAllBytes();
      for (byte b : buffer) {
         System.out.print((char) b);
      }
      System.out.println();
      fi.close();
   }

【讨论】:

  • 那我用什么方法呢?
  • @KingA 我提供了一个直接方法的例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2020-08-23
  • 2011-06-03
  • 2010-11-01
  • 2010-12-27
  • 2018-11-08
  • 2015-04-13
相关资源
最近更新 更多