Thread Datein als Hex auslesen (7 answers)
Opened by Shiu at 2012-10-06 20:55

topeg
 2012-10-07 19:31
#162538 #162538
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Hier mal etwas Code der funktionieren sollte (ungetestet):
more (18.4kb):
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] ); }

View full thread Datein als Hex auslesen