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

ax6ht2ek  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(438)

我试图写一个函数,将检查png文件是否损坏。在这里我发现了一个函数,下面也提供了这个函数,它将文件字节存储到自己的字节数组中。我知道png文件的前8个字节总是包含相同的十进制值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;
    }
dphi5xsq

dphi5xsq1#

您正在将实际字节作为字符打印到终端,而不是像@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);
            }
        }

相关问题