use strict; use warnings; my $file = '...'; open my $pngIn, '<:raw', $file or die "Can't open '$file': $!\n"; read $pngIn, my $header, 8; my ($prefix, $png, $crlf, $ctrlZ, $lf) = unpack "aa3a2aa", $header; die "Bad header prefix\n" if ord $prefix != 0x89; die "Bad header type\n" if $png ne 'PNG'; die "Bad header crlf\n" if $crlf ne "\r\n"; die "Bad header Ctrl-Z\n" if ord $ctrlZ != 0x1a; die "Bad header newline\n" if $lf ne "\n"; while (!eof $pngIn) { read $pngIn, my $chunkHeader, 8 or last; my ($length, $type) = unpack "Na4", $chunkHeader; read $pngIn, my $body, $length + 4 or die "Truncated chunk\n"; my ($payload, $crc) = unpack "a$length N", $body; last if $type eq 'IEND'; }