Das PERL-PGM zum Wandeln von HTerm-Output in ASCII_Dateien

Hauptkategorie: 8-Bitter
Erstellt: 13 November 2011
Zugriffe: 1994

Ich verwende das HTerm-Programm zur Kommunikation mit alten Maschinen. Dabei kann ich die empfangenen Daten leider nicht direkt als ASCII speichern, weil das HTerm dabei die CR+LFs rausschmeißt.

Wenn ich die Daten aber als Hex-Ausgabe (alle Bytes als zwei Ascii-Ziffern, alles in einer Zeile) abspeichere, sind die CR+LFs drin.

Also habe ich ein kleines Perl-PGM gehackt, das zwei Parameter fest erwartet und einen dritten Parm optional verarbeiten kann:

konvert.pl []

Die beiden ersten Parms dürften klar sein. Mit dem dritten Parm schalte ich einen anfangs benötigten Debug-Modus ein.

Und hier ist noch das Script (bitte nicht wundern, ich habe seit 10 Jahren kein Perl mehr angefasst. Man kann das sicher auch in einer einzigen Zeile schreiben...):

 


 

 

use strict;

# printf ("Programmname = %s\n", $0);
# printf ("Parm1 = %s\n", @ARGV[0]);
# printf ("Parm2 = %s\n", @ARGV[1]);

my ($from, $to, $rmax) = @ARGV ;
printf ("from = %s, to = %s, maximale Zeichenzahl: %d\n", $from, $to, $rmax);

local (*FROM, *TO) ;

open(FROM, "$from") or die "Could not open $from for reading: $!\n" ;
open(TO, ">$to") or die "Could not open $to for writing: $!\n" ;

while (defined (my $line = )) { 
	# printf ("Vorher: Zeilenlänge = %d\n", length ($line));
	syswrite (TO, rupf ($line));
}
close(FROM) ;
close(TO) ;

sub rupf {
	my $line = shift;
	my $max = length ($line);

	$max = $rmax if ($rmax > 0);
	my @buffer;
	
	printf ("Zeilenlänge = %d\n", $max);
	($max % 2 == 0) or die "Oops, die Stringlänge ist ungerade. Das kann nicht sein!";

	for (my $i = 0; $i %s 2==>%s\t", $str1, $str2) if ($rmax > 0);
		printf ("Wert1 ==> %2x,  Wert2==>%2x, Gesamt = %2x\n", wert ($str1), wert ($str2), ord (chr (16 * wert ($str1) + wert ($str2)))) if ($rmax > 0);
		push (@buffer, chr (16 * wert ($str1) + wert ($str2)));
	}
	my $b2 = join ('', @buffer);

	$b2 =~ tr/\{\[\}\]\~\^\|/äÄüÜßÖö/;
	$b2 =~ s/\014//g;
	$b2 =~ s/\n//g;
	return $b2;
}


sub wert {
	my $s = shift;

	my $erg = ord ($s) - ord ('0');
	if ($erg > 9) { $erg -= 7; }
	return $erg;
}