Thread Datein als Hex auslesen
(7 answers)
Opened by Shiu at 2012-10-06 20:55
Hier mal etwas Code der funktionieren sollte (ungetestet):
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 #!/usr/bin/perl use strict; use warnings; # Das ist die Datei, die ich Textdokument als Hex schreibe my $file = 'C:\Games\kl.txt'; # temporäre Datei my $tempfile = 'C:\Users\Shiu\hex.txt'; #----------------------------------------------------------------------- # Kodier- und Dekodierfunktionen # Funktion zum kodieren eines binären Strings # bin -> hex sub verpacken { return join( ' ', map { unpack 'h*', $_ } split( //, $_[0] ) ); } # Funktion zum dekodieren eines binären Strings # hex -> bin sub entpacken { my $data = shift; # alles löschen was nicht Hexcode ist $data=~tr/0-9a-fA-F//dc; # das ganze als Hexstring packen return pack( 'h*' ,$data ); } #----------------------------------------------------------------------- # Dateioperationen # datei schreiben sub writeFile { my $file = shift; my $data = shift; open(my $fh, '>', $file) or return 0; # 0 zurück wenn Fehler print $fh $data; close($fh); return 1; # 1 zurück wenn alles OK } # Datei ohne Konvertierung durch Perl schreiben sub writeRawFile { my $file=shift; my $data=shift; open(my $fh, '>', $file) or return 0; # 0 zurück wenn Fehler binmode($fh); print $fh $data; close($fh); return 1; # 1 zurück wenn alles OK } # Datei als ganzes Lesen sub readFile { my $file=shift; local $/=undef; open(my $fh, '<', $file) or return undef; # undef zurück wenn Fehler my $data=<$fh>; close($fh); return $data; # Daten zurück wenn alles OK } # Datei als ganzes lesen ohne konvertierung durch Perl sub readRawFile { my $file=shift; local $/=undef; open(my $fh, '<', $file) or return undef; # undef zurück wenn Fehler binmode($fh); my $data=<$fh>; close($fh); return $data; # Daten zurück wenn alles OK } ######################################################################## # Das Hauptprogramm ######################################################################## # lesen und Kodieren # am Ende des blocks werden die Variablen von perl gelöscht # Damit verhindert man unnötigen "Datenleichen" im Speicher { my $raw_data=readRawFile($file); die("Can't read $file ($!)\n") unless(defined $raw_data); my $hex_data=verpacken($raw_data); writeFile($tempfile,$hex_data) or die("Can't write $tempfile ($!)\n"); } # lesen und dekodieren { my $hex_data=readFile($tempfile); die("Can't read $tempfile ($!)\n") unless(defined $hex_data); my $raw_data=entpacken($hex_data); print $raw_data; } Mir scheint du brauchst die Leerzeichen zwischen den Hexwerten nicht. Wenn dem so ist dann kannst du dir das ganze split, map, join sparen. Das würde dann schon ausreichen: sub verpacken { return unpack( 'h*', $_[0] ); } |