Einzelnen Beitrag anzeigen

Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#8

Re: Hex-Darstellung einer binären Datei

  Alt 13. Jun 2004, 12:29
Ich habe keinen Unterschied zwischen der folgenden Variante und einem HexEditor (TextPad / UltraEdit) entdeckt:

Delphi-Quellcode:
type
  TMyByteArray = array of Byte;

const
  HEXPREFIX = '$';
  HEXSUFFIX = ' ';
  BUFFERSIZE = $FFFF;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  Buffer: TMyByteArray;
  BytesRead: Longint;
  s: String;
  i: Int64;
  HexLength: Integer;
  Startzeit: LongInt;

  function BuffToHex2(ByteArray: TMyByteArray): string;
  var
    i: Integer;
    s: string;
    foo: string;
  const
    HEXSTR = '0123456789ABCDEF';
  begin
    SetLength(foo, Length(ByteArray) * HexLength);
    for i := 0 to High(ByteArray) do
    begin
      s := HEXPREFIX + HEXSTR[((ByteArray[i] and $F0) shr 4) + 1] +
        HEXSTR[(ByteArray[i] and $0F) + 1] + HEXSUFFIX;
      Move(s[1], foo[i * HexLength + 1], HexLength);
    end;
    Result := foo;
  end;

begin
  if OpenDialog1.Execute then
  begin
    HexLength := Length(HEXPREFIX) + 2 + Length(HEXSUFFIX);
    i := 0;
    Memo1.Clear;
    fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
    SetLength(s, fs.Size * HexLength);
    SetLength(Buffer, BUFFERSIZE);
    ProgressBar1.Max := fs.Size;
    try
      Startzeit := GetTickCount;
      repeat
        BytesRead := fs.Read(Buffer[0], BUFFERSIZE);
        Move(BuffToHex2(Buffer)[1], s[i * (HexLength * BUFFERSIZE) + 1],
          HexLength * BytesRead);
        Inc(i);
        ProgressBar1.StepBy(BytesRead);
        Application.ProcessMessages;
      until (BytesRead < BUFFERSIZE) or (GetKeystate(VK_ESCAPE) < 0);
      Caption := FloatToStr((GetTickCount - Startzeit) / 1000);
    finally
      FreeAndNil(fs);
    end;
    if BytesRead < BufferSize then
      Memo1.Text := s
    else
      Progressbar1.Position := 0;
  end;
end;
Das IntToHex hab ich ersetzt, dieses nutzt FmtStr() und hat dadurch einen zimlichen Overhead.
Da Du eh Byteweise arbeitest ist das Ergebniss jeweils auf 2 Hexzeichen begrenzt und andere Darstellungen lassen sich auch durch ein anderes Prefix (z.B. '$00') erreichen.
ProgressBar1.Max auf fs.Size und ein StepBy(BytesRead) sorgen dafür das am Ende kein "Überlauf" entsteht.

MfG,
Tryer
  Mit Zitat antworten Zitat