Guten Abend,
um mich einmal an (einfachen) Kompressionsalgorithmen zu versuchen, habe ich mir den
Huffman-Algorithmus herausgegriffen, der optimal häufig auftretende Zeichen mit kurzen Bitfolgen und seltener auftretende Zeichen mit längeren Bitfolgen versieht.
Da dieser schon gut mit Eingabefeldern auf dem Formular funktionierte, wollte ich ihn für Dateien tauglich machen:
Der zu kodierende Text wird aus einer Datei eingelesen, die Häufigkeiten der Zeichen analysiert, kodiert und soll dann in Bytes verpackt wieder in eine Datei geschieben werden.
Ich schneide also die gesamte Bitfolge in Päckchen von je 8 Bit, z.B. '00111111' als String, woraus ich dann mittels
Delphi-Quellcode:
var
j, iChr : integer;
Buffer : string; //z.B. '00111111'
begin
//
iChr := 0;
for j := 1 to 8
do
iChr := iChr + StrToInt(Buffer[j]) * Trunc(power(2, 8 - j));
end;
zunächst den Dezimalwert des Zeichens berechne und über
chr(iChr)
das Zeichen erzeuge.
So nun zu dem Problem:
Für z.B.
iChr = 137
liefert
chr(iChr)
merkwürdigerweise
#$0089
, was erstens deutlich größer ist als ein Byte und dann auch nichts mit dem vorgesehenen Promille-Zeichen zu tun hat.
Diese fehlerhaften Zeichenfolgen werden dann in der Datei durch '?' ersetzt, der Rest ist korrekt ausgegeben.
Delphi-Quellcode:
var
Datei: Textfile;
begin
AssignFile(Datei, ExtractFilePath(Application.ExeName) + '\' + Dateiname);
ReWrite(Datei);
WriteLN(Datei, sOutput);
CloseFile(Datei);
end;
Habt ihr eine Idee, woran diese "Fehlinterpretation" liegen könnte?