#!/usr/bin/perl use strict; use warnings; my $path = '/media/sdb1/frames/neu/frames_20mb.dat'; my $dest = '/media/sdb1/frames/new/%u/cam.%u.%08u.jpg'; my $HEADER = "\xff\xd8"; my $FOOTER = "\xff\xd9"; my $RE_match_four_bytes = qr<\x55\x88([\x00-\x0b])\x10>; my $data=''; { open( my $dh, '<', $path ) or die("ERROR open $path ($!)\n"); local $/; # binäres lesen, keine Umwandulung von zeichen. binmode($dh); $data =<$dh>; close($dh); } # Man kann reguläre Ausdrücke nicht verschachteln # und hoffen die Positionen im String erhalten bleiben. # Jede neue Regexp setzt die Positionen im String zurück. # man muss ein Match also in einer Regexp unterbringen, # oder man benutzt die spezial Variable $' die alles nach einem Match enthält. # Der Nachteil ist aber, dass das Script dadurch langsamer wird # und viele Daten kopiert werden müssen. my $count = 0; while ($data =~ m/$RE_match_four_bytes.*?($HEADER.*?$FOOTER)/g) { my $un = ord($1); my $image = $2; $count++; my $image_name = sprintf($dest,$un,$un,$count); if(open(my $fh, '>', $image_name)) { print $fh $image; close($fh); } else { warn("ERROR save $image_name ($!)\n"); } }