Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect if PNG file is corrupted in Objective C

I'm downloading jpgs and pngs using NSURLRequest. This works ok but sometimes the files are corrupted. I have seen Catching error: Corrupt JPEG data: premature end of data segment and have this working for jpgs. Does anyone know of a way to do the same for pngs? ie Programatically check if the png data is valid...

like image 922
Chris Jones Avatar asked Jan 16 '23 17:01

Chris Jones


1 Answers

The PNG format has several built in checks. Each "chunk" has a CRC32 check, but to check that you'd need to read the full file.

A more basic check (not foolproof, of course) would be to read the start and ending of the file.

The first 8 bytes should always be the following (decimal) values { 137, 80, 78, 71, 13, 10, 26, 10 } (ref). In particular, the bytes second-to-fourth correspond to the ASCII string "PNG".

In hexadecimal:

89 50 4e 47 0d 0a 1a 0a
.. P  N  G  ...........

You can also check the last 12 bytes of the file (IEND chunk). The middle 4 bytes should correspond to the ASCII string "IEND". More specifically the last 12 bytes should be (in hexa):

00 00 00 00 49 45 4e 44 ae 42 60 82
........... I  E  N  D  ...........

(Strictly speaking, it's not really obligatory for a PNG file to end with those 12 bytes, the IEND chunk itself signals the end of the PNG stream and so a file could in principle have extra trailing bytes which would be ignored by the PNG reader. In practice, this is extremely improbable).

like image 55
leonbloy Avatar answered Jan 30 '23 22:01

leonbloy