覆盖java文件的二进制值



我参与了一个项目,我们通过在指定位置修改字节来隐藏mp3文件中的信息。我在网上找到了可以让我写和读字节的代码,我正在玩它来读取mp3文件中的前10个字节。

但是有一个问题,它一直上升到第四个字节,之后程序结束。换句话说,在for循环中,它只运行到i=4。

这是我得到的输出。

Read 0th character of file: I
Read 1th character of file: D
Read 2th character of file: 3
Read 3th character of file: 
Read 4th character of file: 
Process completed.

如果你注意到程序应该和系统一起结束,那么这个循环就在那里结束了。输出"程序结束"的消息,但甚至没有输出。代码如下。我尝试了几个mp3文件,结果是一样的。

有什么问题吗?为什么我的程序甚至没有给我一个错误信息就结束了?

<>之前进口java.io.File;进口java.io.RandomAccessFile;进口java.io.IOException;

公共类Edit {

private static void doAccess() { try { //Reads mp3 file named a.mp3 File file = new File("a.mp3"); RandomAccessFile raf = new RandomAccessFile(file, "rw"); //In this part I try to read the first 10 bytes in the file byte ch; for (long i = 0; i < 10 ; i++) { raf.seek(i); //position ourselves at position i ch = raf.readByte(); //read the byte at position i System.out.println("Read "+ i + "th character of file: " + (char)ch); //print the byte at that position //repeat till position 10 } System.out.println("End of program"); raf.close(); } catch (IOException e) { System.out.println("IOException:"); e.printStackTrace(); } } public static void main(String[] args) { doAccess(); } } 之前

提前感谢!

我刚试过你的代码,它为我工作。问题是您的IDE处理''字符的方式(第四个字节是'')。为了看到真正的输出,将print语句(在循环内)更改为:

System.out.println("Read " + i + "th character of file: " + ch);

(即省略char (char)强制转换)。然后您将得到如下输出:

Read 0th character of file: 73
Read 1th character of file: 68
Read 2th character of file: 51
Read 3th character of file: 3
Read 4th character of file: 0
Read 5th character of file: 0
Read 6th character of file: 0
Read 7th character of file: 0
Read 8th character of file: 15
Read 9th character of file: 118
End of program

除此之外,我建议如下:

  • 考虑使用预先制作的库来检索/写入MP3元数据。这比从头实现这个逻辑要好得多。
  • 你不需要在循环中使用seek()。当你打开文件时,你在位置0,并且每个readByte()将位置向前移动1。如果将ch变量的定义移到循环中,代码将更可读。如果你只在循环内使用它,就没有理由在循环外定义它。

我已经运行了你的程序,它工作正常。如果您不确定自己在做什么,我建议初学者不要使用IDE。不如使用命令行。

Edit.javaa.mp3放在同一个文件夹中。然后,输入以下命令:

javac Edit.java
java Edit

这将产生正确的输出

我看不出代码有什么问题,而且我不明白它怎么可能产生您报告的输出。

我怀疑你正在运行的类文件与你给我们看的源代码不匹配。


实际上这个程序有几个问题:

    你应该在finally子句中关闭RAF。
  1. byte转换为char是危险的。显然,有些字节不对应于可打印字符。我想这是可能的,其中一个是一些字符,JCreator解释为文件结束字符…

相关内容

  • 没有找到相关文章

最新更新