AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Tutorial Arbeiten mit Dateien auf binärer Ebene
Thema durchsuchen
Ansicht
Themen-Optionen

Tutorial Arbeiten mit Dateien auf binärer Ebene

Ein Thema von Fehlersucher · begonnen am 22. Jan 2013 · letzter Beitrag vom 3. Feb 2013
Antwort Antwort
MeierZwoo

Registriert seit: 3. Dez 2012
106 Beiträge
 
#1

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 31. Jan 2013, 22:34
Du gibst doch zu, dass man Bitmaps in der Regel gut komprimieren kann, oder?
In der Regel eben nicht!

Meine Anmerkungen bezogen sich auf Deine Erklärung zur Kompression von BitMaps per 1en und 0en. Und das führt eben nur bei Sonderfällen zur Verkleinerung, nicht im Allgemeinfall. Und der Allgemeinfall (die Regel) ist nunmal alles Mögliche, bloß keine Simpel-Grafik.

Und solltest du mir nicht glauben, spare dir vorerst die Antwort, nimm einen Hexeditor und öffne paar typische Bitmaps auf deinem Rechner und sag mir was du siehst
Du mußt mir nicht erkären, wie eine BitMap aufgebaut ist. Dazu brauche ich auch keinen HexEditor, die Syntax des Dateiformats kenne ich (fast) auswendig. Verwechsele mich nicht mit dem trollenden TE.

wer speichert schon eine bunte Herbstlandschaft als Bitmap?
Ich!

Daß man allgemeine Bilder nicht als BitMap speichert, sondern als JPG oder GIF oder .. stimmt nun evtl. nur für Leute, denen es egal ist, ob das Original erhalten bleibt. Deshalb speichern Leute, denen das NICHT egal ist, eben weiter als BitMap oder als TIFF (weil TIF-Encoding eben keine Veränderung bedeutet, sondern eine Archivierung mit exakter Reproduktions-Möglichkeit des Originals).
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 31. Jan 2013, 22:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 31. Jan 2013, 23:03
@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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 1. Feb 2013, 11:40
Auch wenn es interessant ist Euch "zuzulesen" wie wär's sich zum Titelthema zu kommen?

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

Registriert seit: 3. Dez 2012
106 Beiträge
 
#5

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 1. Feb 2013, 11:53
Auch wenn es interessant ist Euch "zuzulesen" wie wär's sich zum Titelthema zu kommen?
Das interessiert doch selbst den TE schon lange nicht mehr (Wenn es ihn denn je interessiert hat?)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 1. Feb 2013, 12:26
Auch wenn es interessant ist Euch "zuzulesen" wie wär's sich zum Titelthema zu kommen?
Indirekt ist es immer noch das Thema, nur fortgeschritten. Denn wie er die Bits aus Byte auslesen kann, wurde schon gesagt.

Aber damit es weiter geht, hier ein Konverter Text zu BitString:

Delphi-Quellcode:
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;
Ergebnis:

Code:
0100100001100001011011000110110001101111001000000101011101100101011011000111010000100001
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 1. Feb 2013, 22:38
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#8

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 2. Feb 2013, 12:33
Aber damit es weiter geht, hier ein Konverter Text zu BitString:

Delphi-Quellcode:
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;
Ergebnis:

Code:
0100100001100001011011000110110001101111001000000101011101100101011011000111010000100001
Und damit das auch mit Unicode oder WideString funktioniert:
Delphi-Quellcode:
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;
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Tutorial Arbeiten mit Dateien auf binärer Ebene

  Alt 2. Feb 2013, 12:44
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.
  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 10:59 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