我正在进行我的JAVA毕业项目。
1)在图像中隐藏文本
2)在图像中嵌入图像
3)在音频文件 (WAVE) 中嵌入文本
我已经成功完成了1)和2),如果有需要,我已经附上了源代码。但是我在第三个问题上遇到了麻烦,也就是将数据隐藏在音频文件中。我从一个wave文件创建一个audioinputstream,并将其数据读入一个字节数组,但读取时很多东西不清楚。我猜测前44个字节是头字节吗?(因为文件是WAVE格式),还是根本没有复制头文件。问题是,在解码时,我必须再次从新创建的音频文件中读取数据到一个字节数组中。而我无法找到我隐藏数据的字节。
有人能告诉我当我们从音频输入流中读取数据到一个字节数组时实际发生了什么,我的意思是实际上会有哪些数据被读入到字节数组中?
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
如果我在编辑后立即解码字节数组,则可以正常工作并显示隐藏消息,但在再次创建字节数组并读取其音频输入流数据并解码该字节数组之后,它就无法正常工作。 我想知道为什么? 请帮忙。