Hi,
habe mir so 'n kleinen Hex - Betrachter gebaut. Mein Problemchen liegt darin das
TMemoryStream.ReadBuffer mir nicht die Anzahl der gelesenen Bytes zurück gibt.
Das Resultat ist nun bei dem Code ein EReadError. Gibt es da was in der Art wie
bei Blockread oder muss ich mir das selbst ausrechnen ?
Delphi-Quellcode:
procedure ViewFileAsHex(MemStream: TMemoryStream; aMemo: TMemo);
const
MaxChars = 32;
var
s, c: string;
b: array [0..MaxChars-1] of Byte;
n: integer;
i: Int64;
sz: Longint;
procedure AddChar(var X; Count: Integer; Value: Byte);
var n: Byte;
begin
for n := 1 to Count do
s := s + Chr(Value);
end;
begin
if MemStream <> nil then
begin
aMemo.Font.Name := 'Terminal';
aMemo.Font.Size := 9;
aMemo.Clear;
MemStream.Position := 0;
i := 0;
sz := 1;
While sz > 0 do
begin
sz := MemStream.Read(b, sizeof(b));
s := '';
c := '';
for n := 0 to sz-1 do
begin
s := s + format('%2.2x', [b[n]]) + #32;
if ord(b[n]) <= 13 then c := c + '.' else c := c + Chr(b[n]);
end;
if length(s)< (MaxChars*2)+MaxChars then
AddChar(s, ((MaxChars*2)+MaxChars)-length(s), 32);
aMemo.Lines.Add(format('%8.8x %s %s %s %s',
[MemStream.Position-1-(MaxChars-1) ,#$B3 , s, #$B3, c]));
if i mod 10 = 0 then Application.ProcessMessages;
inc(i);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
m: TMemoryStream;
begin
m := TMemoryStream.Create;
try
m.LoadFromFile('C:\Windows\Notepad.exe');
ViewFileAsHex(m, Memo1);
finally
m.Free;
end;
end;
[edit=tp]Code korrigiert/vervollständigt[/edit]