$message =~ s/\^@//;
$message =~ tr/[\^@]//;
1 2 3
use Data::Dumper; local $Data::Dumper::Useqq = 1; # nicht-druckbare Zeichen lesbar ausgeben print Dumper $message;
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
0: ^@
1: ^A
2: ^B
3: ^C
4: ^D
5: ^E
6: ^F
7: ^G
8: ^H
9:
10:
11: ^K
12: ^L
13: ^M
14: ^N
15: ^O
16: ^P
17: ^Q
18: ^R
19: ^S
20: ^T
21: ^U
22: ^V
23: ^W
24: ^X
25: ^Y
26: ^Z
27: ^[
28: ^\
29: ^]
30: ^^
31: ^_
32:
33: !
print unpack "Z*", $string;
unpack "Z*", $message;
O_BINARY
2014-03-11T16:14:37 rostiWie auch immer, warum das Gerät mal mit \0 terminiert und mal nicht, das sollte die Packungsbeilage schon hergeben ;)
QuotePS: Vermutung, sofern die Dateien als Text-Datei auf Windos gespeichert wurden, kann es schon sein, das eine \0 am Ende entfernt wird, wenn die Datei im Textmodus geöffnet wird. Das macht Windows (böse) aber Du kannst das verhindern, wenn Du mit Perls IO::File einen Handler erstellst und beim Öffnen (!) angibst:
Code (perl): (dl )O_BINARY
(Ein nachträgliches $FH->binmode käme in diesem Fall zu spät)
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
#!/usr/bin/perl ########################################################################### # teste Verhalten sysopen() mit 0x1A # VARs my $file = 'testfile'; ########################################################################### use strict; use Fcntl qw(:DEFAULT :flock); # Schreibe genau 1 Byte in die Datei sysopen(OUT, $file, O_RDWR|O_CREAT) or die $!; seek OUT, 0, 0; truncate OUT, 0; binmode OUT; print OUT pack "C*", 0x1A; close OUT; # Testen der Dateilänge my @stats = stat($file); printf qq(Dateilaenge nach Schreiben: %u Byte\n), $stats[7]; # Datei nur öffnen mit sysopen(), nix weiter sysopen(OUT, $file, O_RDWR|O_CREAT) or die $!; close OUT; # Testen der Dateilänge @stats = stat($file); printf qq(Dateilaenge nach sysopen: %u Byte\n), $stats[7];
QuoteWärst du so nett und würdest mit verraten, was da unter Windows rauskommt?
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import os fd = os.open( "test", os.O_RDWR|os.O_CREAT ) os.write(fd, "\x1A") fstats = os.fstat( fd ) os.close( fd ) print "Create: ",fstats.st_size fd2 = os.open( "test", os.O_RDWR|os.O_CREAT ) fstats2 = os.fstat( fd2 ) os.close( fd2 ) print "Reopen: ",fstats2.st_size
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# Datei erzeugen open (OUT, ">", $file) or die $!; binmode OUT or die $!; print OUT pack "C*", 0x1A; close OUT or die $!; # Testen der Dateilänge printf qq(Dateilaenge nach Erzeugen: %u Byte\n), (stat($file))[7]; # Datei zum Lesen/Schreiben öffnen open(OUT, '+<', $file) or die $!; printf qq(Dateilaenge nach open +<: %u Byte\n), (stat($file))[7]; close OUT or die $!; # Testen der Dateilänge printf qq(Dateilaenge nach close von open +<: %u Byte\n), (stat($file))[7];
QuoteWhen a file is opened by using the "a" access type or the "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned by using fseek or rewind, but is always moved back to the end of the file before any write operation is carried out. Therefore, existing data cannot be overwritten.
The "a" mode does not remove the EOF marker before it appends to the file. After appending has occurred, the MS-DOS TYPE command only shows data up to the original EOF marker and not any data appended to the file. Before it appends to the file, the "a+" mode does remove the EOF marker. After appending, the MS-DOS TYPE command shows all data in the file. The "a+" mode is required for appending to a stream file that is terminated with the CTRL+Z EOF marker.
$message =~ s/\\0//;