Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Hex Betrachter - TMemoryStream.ReadBuffer Problemchen (https://www.delphipraxis.net/71659-hex-betrachter-tmemorystream-readbuffer-problemchen.html)

turboPASCAL 19. Jun 2006 08:18


Hex Betrachter - TMemoryStream.ReadBuffer Problemchen
 
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]

shmia 19. Jun 2006 09:05

Re: Hex Betrachter - TMemoryStream.ReadBuffer Problemchen
 
Du darfst nicht einfach immer sizeof(b) Bytes lesen, sondern die Anzahl der zu lesenden Bytes vorher ausrechnen.
Delphi-Quellcode:
var
   bsize : integer; // evtl. Int64 je nach Delphi Version
...
   bsize := ms.Size-ms.Position;
   if bsize > sizeof(b) then
      bsize := sizeof(b);
   while bsize > 0 do

     ms.ReadBuffer(b, bsize);
.....

Hawkeye219 19. Jun 2006 09:18

Re: Hex Betrachter - TMemoryStream.ReadBuffer Problemchen
 
Hallo,

schon mal einen Versuch mit Delphi-Referenz durchsuchenTMemoryStream.Read unternommen?

Gruß Hawkeye

turboPASCAL 19. Jun 2006 10:05

Re: Hex Betrachter - TMemoryStream.ReadBuffer Problemchen
 
Zitat:

Zitat von Hawkeye219
schon mal einen Versuch mit Delphi-Referenz durchsuchenTMemoryStream.Read unternommen?

Aus irgend einem Grund hatte ich das übersehen...warscheinlich wegen dem Read(ln). :stupid: Thx.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz