Binärdatei in Perl schreiben

Ich habe verschlüsselte Werte in Form von 8-Bit Zahlen vorliegen und muss diese in eine Datei schreiben. Funktionen wie int() und sprintf() schreiben leider den String der Zahl in die Datei, d.h. sprintf("%d", "135") schreibt die drei Zeichen "1", "3" und "5" in die Datei, anstatt das Byte mit dem Wert 135. :rolleyes:

ASCII-Zeichen können wie üblich verarbeitet werden:

Code:
#!/usr/bin/perl -w
use strict;

open FILE, "> file.txt";
binmode FILE;
print FILE chr(65); # schreibe 'A'
print FILE chr(66); # schreibe 'B'
print FILE chr(67); # schreibe 'C'
print FILE "\n";     #  Zeilenumbruch 
close FILE;
exit 0;
Code:
cat file.txt 
ABC
Stoßen aber chr() oder print() auf ein NON-ASCII-Zeichen, erhält man Fehlermeldungen wie z.B. : "Wide Character in print" (was ja formal korrekt ist).

Wie bekomme ich beliebige 8-Bit Werte in eine Datei hinein?


Greetz
Hackse
 
Wie bekomme ich beliebige 8-Bit Werte in eine Datei hinein?

perldoc perldiag hat gesagt.:
Wide character in %s
(S utf8) Perl met a wide character (>255) when it wasn't expecting one.
This warning is by default on for I/O (like print). The easiest way to
quiet this warning is simply to add the ":utf8" layer to the output, e.g.
"binmode STDOUT, ':utf8'". Another way to turn off the warning is to add
"no warnings 'utf8';" but that is often closer to cheating. In general, you
are supposed to explicitly mark the filehandle with an encoding, see open
and "binmode" in perlfunc.

HTH

Micha
 
wenn du wirklich binärdaten willst -> filehandle auf binmode ... danach musst du noch vorgeben wie die daten interpretiert/dargestellt werden sollen, dazu wirf mal einen blick auf die pack() funktion ... beim lesen hilft unpack()
 
Danke für den Hinweis, GrafZahl.

Hab's mir angesehen. Irgendwie bekomme ich via unpack() dennoch die Strings der Zahlen in die Datei, anstatt die Werte.

Vereinfacht lässt sich das Problem wie folgt runterbrechen:

1.) Textdatei zeilenweise einlesen
2.) Jedes Zeichen der eingelesenen Datei z.B. mit XOR 5 (xor fünf) überlegen
3.) xorifizierte Datei in das Dateisystem schreiben.

Bisher habe ich folgendes:

Code:
#!/usr/bin/perl -w
use strict;

my $crypt_factor=5;

#$1: input text-file
#$2: encrypted outputfile

  sub encrypt() {
    my ($file, $outfile) = @_;
    my $buffer_out;
    my $symbol;
    open (FIN, "<", $file) || die "cannot open file: $file\n";
    my @buffer=<FIN>;
    close(FIN);
    open (FOUT, ">", "$outfile") || die "cannot open output file: $outfile\n";
    binmode(FOUT);
    map {
      my $pointer=\$_;                           # Zeiger auf aktuelle Zeile
      my $len=length($$pointer);                 # Zeilenlaenge ermitteln
      my $xor_str=($crypt_factor) x $len;        # xor-Pattern erzeugen, gleiche Laenge wie akt. Zeile
      my $out_str=$$pointer ^ $xor_str;          # xor Pattern ueber String legen
      my @out_vector=unpack("C$len", $out_str);  # xor-verschluesselte Zeichen als Single-Bytes in Vektor speichern
      for (@out_vector) {
        print FOUT $_ || die ("error while writing to output file: $outfile\n");
      }
    } @buffer;
    close(FOUT);
    return 0;
  }

my $f=shift @ARGV;
&encrypt("$f", "$f.crypt");
exit 0;
Code:
./encrypt.pl test.txt
Code:
cat test.txt
zeile 1
zeile 2
zeile 3
ende
Code:
cat test.txt.crypt 
1499222095105723220814992220951057428816149922209510573632801347509072
Habe für unpack() verschiedene Templates versucht.

Ideen?:wink:
 
Zuletzt bearbeitet:
Zurück
Oben