我开始研究Java NIO API,第一次尝试读取JPEG文件的幻数。
这里是代码
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.io.FileInputStream;
public class JpegMagicNumber {
public static void main(String[] args) throws Exception {
FileChannel file = new FileInputStream(args[0]).getChannel();
ByteBuffer buffer = ByteBuffer.allocate(6);
file.read(buffer);
buffer.flip();
System.out.println(Charset.defaultCharset().decode(buffer).toString());
file.close();
buffer.clear();
}
}
我希望恢复魔术数字字符,但我得到的只是将垃圾数据输入到终端中。
我做错什么了吗?
简短回答:代码没有特别的缺陷。 JPEG前面只是“垃圾”。
长答案:JPEG内部由段组成,一个接一个。这些段以0xFF字节开头,后跟标识符字节,然后是可选的有效内容/内容。
示例开始:
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 00 01 00 00 FF E1
图像从图像开始(SOI)段开始,为0xFF 0xD8,没有有效负载。
下一段是“特定于应用程序的”,0xFF 0xE0。有效负载的长度后跟两个字节(包括这两个字节!)。
0x4A 0x46 0x49 0x46:JFIF
←也许您正在寻找什么?
JPEG在您可能需要的意义上没有一个神奇的数字,例如zip的'PK'或PNG的'‰PNG'。 (最接近的是SOI和下一段的第一个字节的0xFF 0xD8 0xFF。)
所以您的代码does可以正确读取文件的前六个字节,按照您的本机平台将它们解码为字符,然后将其打印出来,但是JPEG标头就是这样。