# extracts APP1 data from jpeg file. # usage: perl jpeggetapp1.pl < foo.jpeg > foo.app1 sub skip { local($len) = @_; local($junk); if (read(STDIN, $junk, $len) != $len) { print STDERR "error skipping $len\n"; exit 1; } } sub dump { local($len) = @_; local($body); if (read(STDIN, $body, $len) != $len) { print STDERR "error skipping $len\n"; exit 1; } syswrite(STDOUT, $body, $len); } if (read(STDIN, $magic, 2) != 2) { print STDERR "not jpeg file\n"; exit 1; } if ($magic ne "\377\330") { # ff d8 print STDERR "not jpeg file\n"; exit 1; } while (1) { if (read(STDIN, $magic, 2) != 2) { print STDERR "error reading section header\n"; exit 1; } if (substr($magic, 0, 1) ne "\377") { # ff print STDERR "error reading section header\n"; exit 1; } if (substr($magic, 1, 1) eq "\331") { print STDERR "APP1 not found\n"; exit 1; } elsif (substr($magic, 1, 1) eq "\341") { # e1, APP1 if (read(STDIN, $len, 2) != 2) { print STDERR "error reading section len\n"; exit 1; } $len = unpack('n', $len); &dump($len - 2); exit 0; } else { print STDERR 'section is ' . unpack('xC', $magic) . "\n"; if (read(STDIN, $len, 2) != 2) { print STDERR "error reading section len\n"; exit 1; } $len = unpack('n', $len); &skip($len - 2); } }