Einzelnen Beitrag anzeigen

Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#1

Hex Betrachter - TMemoryStream.ReadBuffer Problemchen

  Alt 19. Jun 2006, 09:18
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]
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat