How to properly validate PNG header in java?

Tags: , , ,



I’m trying to write a function which will check if PNG file is not corrupted. Here I found a function, also provided below, which stores file bytes into its own byte array. I know that the first eight bytes of a PNG file always contain the same decimal values 137 80 78 71 13 10 26 10 (hex: 89 50 4e 47 0d 0a 1a 0a). When I print the context of the byte array which starts with -1-40-1-3201674707370011007207200-1-370-124022222232235333565555686666681088888810101010101 ... and then convert it to decimal values I don’t see the magic number in the beginning. Please, what have I misunderstood? I would like to read the image and compare its header to either decimal or hex values.

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;
    }

Answer

You are printing the actual bytes as characters to the terminal, not the representation of those bytes in decimal or hex, as @Andreas says.

You can check the header with:

        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);
            }
        }


Source: stackoverflow