使用FileChannel和ByteBuffer读取JPEG幻数

问题描述 投票:1回答:1

我开始研究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 nio fileinputstream bytebuffer filechannel
1个回答
0
投票

简短回答:代码没有特别的缺陷。 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标头就是这样。

© www.soinside.com 2019 - 2024. All rights reserved.