![]() |
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:
[edit=tp]Code korrigiert/vervollständigt[/edit]
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; |
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); ..... |
Re: Hex Betrachter - TMemoryStream.ReadBuffer Problemchen
|
Re: Hex Betrachter - TMemoryStream.ReadBuffer Problemchen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz