![]() |
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Nun, die Erklärungen und Beispiele zu Kompression sind in diesem Stadium eher als Grundkonzepte zu betrachten und sind noch sehr weit von irgendwelchen Anleitungen. Ich hab Bitmap als Beispiel gewählt, da ich Bitmap Grafiken im allgemeinen als großflächig gleichfarbig kenne, was nicht bedeutet, dass sie nicht alles darstellen können. Es ist eben meine Beobachtung, dass meine Bitmaps oft 60 bis 90% aus einer Farbe bestehen.
Trotzdem, der TE hat sich viel vorgenommen und im allgemeinen kann man Delphi gut lernen wenn man gleich ein Großprojekt anfängt, aber einen Komprimieralgorithmus schreiben wollen und parallel fragen wie man an die einzelnen Bits eines Bytes kommt, also da bestehen noch paar Lücken. |
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
@MeierZwoo & @Popov
irgendwie habt ihr beide Recht. Ein Kompressionsprogramm sollte nicht nur eine Methode zum komprimieren kennen, sondern die Daten vorher analysieren und dann die geeignete Variante wählen. Manchmal wird die Datei auch einfach nur so gespeichert, weil keine sinnvolle Kompression möglich ist ;) |
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Auch wenn es interessant ist Euch "zuzulesen" wie wär's sich zum Titelthema zu kommen?
Gruß K-H |
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Zitat:
|
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Zitat:
Aber damit es weiter geht, hier ein Konverter Text zu BitString:
Delphi-Quellcode:
Ergebnis:
function TextToBitStr(Str: string): string;
function ByteToBits(B: Byte): string; var i: Integer; begin Result := ''; for i := 0 to 7 do Result := IntToStr(((B shr i) and 1)) + Result; end; var i: Integer; begin Result := ''; for i := 1 to Length(Str) do Result := Result + ByteToBits(Ord(Str[i])); end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(TextToBitStr('Hallo Welt!')); end;
Code:
0100100001100001011011000110110001101111001000000101011101100101011011000111010000100001
|
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
So, ich hab zum Spaß einen kleinen Algorithmus für Textkomprimierung geschrieben. Der Algorithmus funktioniert so, dass sich wiederholende Wörter durch Adressen auf das erste Wort ersetzte werden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s: string; i: Integer; sl: TStringList; begin s := 'AUCH EIN KLEINER BEITRAG IST EIN BEITRAG'; //Text der komprimiert wird. Er ist 40 Zeichen lang ShowMessage(Format('Text lautet "%s" und ist unkomprimiert %d Bytes lang.', [s, Length(s)])); sl := TStringList.Create; try sl.Delimiter := ' '; //-------------------------------------------------------------------------- ShowMessage('Der Text wird jetzt komprimiert.'); sl.DelimitedText := s; for i := sl.Count - 1 downto 0 do if (sl.IndexOf(sl[i]) <> i) and (sl.IndexOf(sl[i]) > -1) then sl[i] := '~' + IntToStr(sl.IndexOf(sl[i])); s := sl.DelimitedText; ShowMessage(Format('Text lautet "%s" und ist komprimiert %d Bytes lang.', [s, Length(s)])); //-------------------------------------------------------------------------- ShowMessage('Der Text wird jetzt wieder dekomprimiert.'); sl.DelimitedText := s; for i := 0 to sl.Count - 1 do if (Length(sl[i]) > 1) and (sl[i][1] = '~') then sl[i] := sl[StrToInt(Copy(sl[i], 2, MaxInt))]; s := sl.DelimitedText; ShowMessage(Format('Text lautet "%s" und ist unkomprimiert %d Bytes lang.', [s, Length(s)])); finally sl.Free; end; end; |
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Zitat:
Delphi-Quellcode:
Ich bin nicht sicher, ob es auch Codierungen mit mehr als 4 Byte je Zeichen gibt. Falls ja, müsste man AsNumber halt als int64 deklarieren und entsprechend casten.
function CharToBits(c: Char): string;
const BITS_PER_BYTE = 8; BITVALUES: array[Boolean] of char = ('0', '1'); var i, BitWidth: integer; AsNumber: Cardinal; begin BitWidth := BITS_PER_BYTE * SizeOf(c); SetLength(Result, BitWidth); AsNumber := Cardinal(c); for i := BitWidth downto 1 do begin Result[i] := BITVALUES[(AsNumber and 1) = 1]; AsNumber := AsNumber shr 1; end; end; function StrToBits(const s: string): string; var i: integer; begin Result := ''; for i := 1 to Length(s) do Result := Result + CharToBits(s[i]); end; |
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Du hast Recht, ich musste mir auch mal sagen, dass die Annahme, dass ein Byte aus 8 Bits besteht, eher eine Legende ist. Andere Systeme, andere Bytes.
|
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Ab Delphi 2009 sind das 2 Bytes, da String dort UTF-16 kodiert ist. Wer dann nicht bedacht hat, bei solchen Operationen mit SizeOf(Char) zu multiplizieren, hatte die Kappe auf. Die Foren waren seinerzeit voll mit solchen Beiträgen ;)
|
AW: Tutorial Arbeiten mit Dateien auf binärer Ebene
Nein, ich meine hier weniger die genutzten Bytes beim String, sondern aus wie viel Bits besteht ein Byte. Beim PC eben aus 8, aber bei anderen Systemen aus 4 oder 7 usw. Somit ist Byte kein eindeutige Größe.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 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 by Thomas Breitkreuz