如何在java中正确验证PNG头文件?

如何在java中正确验证PNG头文件?,java,validation,header,png,Java,Validation,Header,Png,我正在尝试编写一个函数,它将检查PNG文件是否损坏。我发现了一个函数,下面也提供了这个函数,它将文件字节存储到自己的字节数组中。我知道PNG文件的前八个字节总是包含相同的十进制值137 80 78 71 13 10 26 10(十六进制:89 50 4e 47 0d 0a 1a 0a)。 当我打印以-1-40-1-3201674707370011007200-1-370-124022222235333565555686666666810888810101010101开头的字节数组的上下文时然后将

我正在尝试编写一个函数,它将检查PNG文件是否损坏。我发现了一个函数,下面也提供了这个函数,它将文件字节存储到自己的字节数组中。我知道PNG文件的前八个字节总是包含相同的十进制值137 80 78 71 13 10 26 10(十六进制:89 50 4e 47 0d 0a 1a 0a)。 当我打印以
-1-40-1-3201674707370011007200-1-370-124022222235333565555686666666810888810101010101开头的字节数组的上下文时然后将其转换为十进制值我在开头没有看到神奇的数字。请问,我误解了什么?我想阅读图像并将其标题与十进制或十六进制值进行比较

public static void main(String[] args)
    {

        File file = new File("src/resources/dog.png");

        readContentIntoByteArray(file);
    }
private静态字节[]readContentIntoByteArray(文件)
{
FileInputStream FileInputStream=null;
byte[]bFile=新字节[(int)file.length()];
尝试
{
//将文件转换为字节数组
fileInputStream=新的fileInputStream(文件);
fileInputStream.read(bFile);
fileInputStream.close();
对于(int i=0;i
您正在将实际字节作为字符打印到终端,而不是像@Andreas所说的那样以十进制或十六进制表示这些字节

您可以使用以下选项检查标题:

        byte[] data = readContentIntoByteArray(file);
        byte[] expected = new byte[] {-119, 80, 78, 71, 13, 10, 26, 10};
        for (int i = 0; i < expected.length; i++) {
            if (expected[i] != data[i]) {
                System.out.println("mismatch at " + i);
            }
        }
byte[]data=readContentIntoByteArray(文件);
字节[]预期=新字节[]{-119,80,78,71,13,10,26,10};
对于(int i=0;i
FYI:要将整个文件读入
byte[]
,请使用
byte[]bFile=Files.readAllBytes(path.get(“dog.png”))
“我误解了什么?”如何打印字节。要以十六进制形式打印字节,请使用
printf(“%02x”,b文件[i])
。要以十进制形式打印字节,请使用
printf(“%d”,b文件[i])
print(b文件[i]+”)
@Andreas确实我在打印时忘记了指定类型。谢谢你提醒我,非常感谢。这种检查是我试图实现的。后来我发现我的“dog.png”尽管它有png扩展名,但它的标题看起来是这样的
ff d8 ff e0-00 10 4a 46-49 46 00 01-01 00 48
而不是
89 50 4e 47-0d 0a 1a 0a-00 00 00 0d-49 48 44 52
,这是最让我困惑的事情,它是如何在仍然没有被渲染和显示图片的情况下实现的。
        byte[] data = readContentIntoByteArray(file);
        byte[] expected = new byte[] {-119, 80, 78, 71, 13, 10, 26, 10};
        for (int i = 0; i < expected.length; i++) {
            if (expected[i] != data[i]) {
                System.out.println("mismatch at " + i);
            }
        }