首页 > 解决方案 > 如何在java中正确验证PNG头?

问题描述

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

public static void main(String[] args)
    {

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

        readContentIntoByteArray(file);
    }
 private static byte[] readContentIntoByteArray(File file)
    {
        FileInputStream fileInputStream = null;
        byte[] bFile = new byte[(int) file.length()];
        try
        {
            //convert file into array of bytes
            fileInputStream = new FileInputStream(file);
            fileInputStream.read(bFile);
            fileInputStream.close();
            for (int i = 0; i < bFile.length; i++)
            {
                System.out.print((char) bFile[i]);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return bFile;
    }

标签: javavalidationheaderpng

解决方案


正如@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);
            }
        }

推荐阅读