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