我正在研究JAVA的最后一年项目
1)将图像隐藏在图像中
2)图像中的图像
3)音频文件(WAVE)中的文字
我已成功完成1)和2)并附加了源代码,如果有人需要它。 我在第3个中遇到了麻烦,即将数据隐藏在音频文件中。 我从wave文件中创建audioinputstream并将其数据读入字节数组 但是很多事情都不清楚,而读取我猜测前44个字节是标题字节?(因为文件是WAVE格式)或者根本没有复制标题。 问题是 .... 在再次解码时,我必须从字节数组中新创建的音频文件中读取数据。而且我无法找到我隐藏数据的字节。
有人能告诉我当我们从audioinputstream读取数据到字节数组时到底发生了什么,我的意思是实际读取到字节数组中的是什么?
File fileIn = new File("C:\\Users\\Rahul\\Desktop\\pro\\Don't Stay.wav");
AudioInputStream audioInputStream =
AudioSystem.getAudioInputStream(fileIn);
int avail= audioInputStream.available();
System.out.println("bytes available " +avail);
System.out.println(audioInputStream.markSupported());
int bytesPerFrame =
audioInputStream.getFormat().getFrameSize();
// Set an arbitrary buffer size of 1024 frames.
int numBytes = 1024 * bytesPerFrame;
byte[] audioBytes = new byte[numBytes];
audioInputStream.read(audioBytes);
byte btext[]=Stego_text("good morning!");
byte bcoded[]=steg.encoding(audioBytes,btext,0);
byte[] stg= a.decode_text(audioBytes);
String obtain= new String(stg);
System.out.println(">>>"+ obtain); //the hidden message gets successfully displayed here
try {
//
AudioSystem.write(audioInputStream, Type.WAVE, new File("C:\\Users\\Rahul\\Desktop\\pro\\Don't Stay_restored.wav"));
} catch (Exception e) {
e.printStackTrace();
}
byte[] audioBytesNew = new byte[numBytes];
audioInputStream.read(audioBytesNew);
byte[] stg1= a.decode_text(audioBytesNew);
String obtain1= new String(stg1);
System.out.println(">>>"+ obtain1); //the hidden message does not get displayed
如果我在编辑后解码字节数组,那么它工作正常并显示隐藏的消息,但在再次创建一个字节数组并读入audioinputsream数据然后解码该字节数组..它不起作用。我想知道为什么?请帮帮我。
答案 0 :(得分:1)
前44个字节确实是WAV的标题(参见https://ccrma.stanford.edu/courses/422/projects/WaveFormat/)
如果您在HEX编辑器中打开文件,您会看到它的样子(http://imgur.com/iliA40R)
如果比较文件中的数据和InputStream读取的数据,则匹配。
如果您需要再次阅读该文件,则应关闭并重新打开您的信息流。 如果你可以标记文件,你可以在阅读之前标记它,并在第一次读取完成后调用reset()。