![]() |
Problem mit Konvertierung von langen Bitfolgen in Zeichen
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:
zunächst den Dezimalwert des Zeichens berechne und über
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;
Delphi-Quellcode:
das Zeichen erzeuge.
chr(iChr)
So nun zu dem Problem: Für z.B.
Delphi-Quellcode:
liefert
iChr = 137
Delphi-Quellcode:
merkwürdigerweise
chr(iChr)
Delphi-Quellcode:
, was erstens deutlich größer ist als ein Byte und dann auch nichts mit dem vorgesehenen Promille-Zeichen zu tun hat.
#$0089
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? |
AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen
Guten Abend,
Hex 0x89 ist nun mal dezimal 137 Aber warum Du mit chr(137) #$0089 herausbekommst? Ich hätte ein Zeichen erwartet. Nachtrag: Warum der Weg über Strings und nicht gleich mit Byte? Grüße Klaus |
AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen
Du weißt aber schon, das dein Delphi intern mit UTF-16 arbeitet, oder?
|
AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen
@ Klaus01: Danke für den Hinweis, ich habe jetzt den Umweg über String durch ein Array of Byte gestrichen, sodass er natürlich in der Funktion richtige Werte ausspuckt.:thumb:
Jedoch stellt sich da für mich das Problem, wie ich dieses Array of Byte in eine (Text-)Datei speichern kann, da es sich ja nun nicht mehr um einen String mit reellen Zeichen handelt (--> WriteLN()). |
AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen
Hallo,
wenn Du bei den "alten" Routienen bleiben willst.. OutFile : File of Byte Assign/Reset/Rewrite wie gehabt Mit write(outFile,DatenByte) wird dann in die Datei geschrieben. Wenn Du es etwas fortschrittlicher machen willst, schau Dir mal TFileStream an. Grüße Klaus |
AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen
Delphi-Quellcode:
Das ist doch ganz im Sinne des Problemstellers!
Ì;‰••=>2ÔÆîgë‹§&¡ÅÒ§÷bïu #2(/4
Tausend Dank, v.a. Klaus, funktioniert mit den Bytes. In einer ruhigen Minute außerhalb der Schulwoche werde ich mit dann mal um den FileStream kümmern (...will ja nicht so ganz den Anschluss verpassen und daher neues Gebiet betreten...). Schönen Abend noch Hannes |
AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen
Also bei einem
Delphi-Quellcode:
bietet sich meiner Meinung nach ein
array of Byte
Delphi-Quellcode:
sofort an. Und wenn man die neueren Funktionalitäten nutzen will, ist von dort der Schritt zu
blockwrite
Delphi-Quellcode:
nur noch ein ganz kleiner.
TFilestream
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz