AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Problem mit Konvertierung von langen Bitfolgen in Zeichen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Konvertierung von langen Bitfolgen in Zeichen

Ein Thema von Hannes91 · begonnen am 12. Jan 2011 · letzter Beitrag vom 13. Jan 2011
Antwort Antwort
Benutzerbild von Hannes91
Hannes91

Registriert seit: 28. Aug 2010
Ort: Hamburg
15 Beiträge
 
Delphi 2010 Professional
 
#1

Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 12. Jan 2011, 20:10
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?
Hannes
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 12. Jan 2011, 20:20
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
Klaus

Geändert von Klaus01 (12. Jan 2011 um 20:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 12. Jan 2011, 20:24
Du weißt aber schon, das dein Delphi intern mit UTF-16 arbeitet, oder?
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Hannes91
Hannes91

Registriert seit: 28. Aug 2010
Ort: Hamburg
15 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 12. Jan 2011, 20:40
@ 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.

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()).
Hannes
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 12. Jan 2011, 20:44
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Hannes91
Hannes91

Registriert seit: 28. Aug 2010
Ort: Hamburg
15 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 12. Jan 2011, 20:58
Ì;‰••=>2ÔÆîg닧&¡ÅÒ§÷bïu #2(/4 Das ist doch ganz im Sinne des Problemstellers!

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
Hannes
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Problem mit Konvertierung von langen Bitfolgen in Zeichen

  Alt 13. Jan 2011, 13:12
Also bei einem array of Byte bietet sich meiner Meinung nach ein blockwrite sofort an. Und wenn man die neueren Funktionalitäten nutzen will, ist von dort der Schritt zu TFilestream nur noch ein ganz kleiner.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz