![]() |
Daten aus einem Stream lesen und darstellen
Hallo!
Ich will Daten aus einer Datei bzw. einem Stream auslesen und wie in einem Hex-Editor darstellen. Ich scheitere aber daran, dass ich nicht weiß, welchen Datentyp ich für die Variable verwenden soll in die die Daten aus dem Stream gelesen werden. Ich habe folgendes Testprogramm geschrieben:
Delphi-Quellcode:
Bei einem Klick auf den Read-Button sollen die ersten 128 Bytes einer Textdatei eingelesen und im Hex-Format angezeigt werden. Die Text Datei enhält folgenden Inhalt:
unit main;
... function ShowBinary(var Data; Count: Cardinal): TStrings; implementation {$R *.dfm} procedure TForm1.readBtClick(Sender: TObject); var Stream: TStream; Data: array of byte; begin Memo1.Lines.Clear; setLength(Data, 128); Stream := TFileStream.Create('D:\Test.txt', fmOpenRead or fmShareDenyNone); Stream.Seek(0, soFromBeginning); Stream.Read(Data[0], 128); // <-- funktioniert, aber falsche Darstellung //Stream.Read(Data, 128); // <-- korrekte Darstellung aber Exception Memo1.Lines.AddStrings(ShowBinary(Data, 128)); end; // ShowBinary stammt von [url]http://www.swissdelphicenter.com/de/showcode.php?id=944[/url] // Wurde nur leicht modifiziert um TStrings zurück zu geben... function ShowBinary(var Data; Count: Cardinal): TStrings; var line: string[80]; i: Cardinal; p: PChar; nStr: string[4]; const posStart = 1; binStart = 7; ascStart = 57; HexChars: PChar = '0123456789ABCDEF'; begin result := TStringList.Create; p := @Data; line := ''; for i := 0 to Count - 1 do begin if (i mod 16) = 0 then begin if Length(line) > 0 then result.Add(line); FillChar(line, SizeOf(line), ' '); line[0] := Chr(72); nStr := Format('%4.4X', [i]); Move(nStr[1], line[posStart], Length(nStr)); line[posStart + 4] := ':'; end; if p[i] >= ' ' then line[i mod 16 + ascStart] := p[i] else line[i mod 16 + ascStart] := '.'; line[binStart + 3 * (i mod 16)] := HexChars[(Ord(p[i]) shr 4) and $F]; line[binStart + 3 * (i mod 16) + 1] := HexChars[Ord(p[i]) and $F]; end; result.Add(line); end; Zitat:
Zitat:
Verwende ich hingegen "Stream.Read(Data, 128);" wird eine Exception ausgelöst, aber es wird trotzdem der korrekte Inhalt angezeigt: Zitat:
Zitat:
Besten Dank Ares |
Re: Daten aus einem Stream lesen und darstellen
Warum übergibst du nicht den Pointer des Streams? (Hast da übrigens 'n Speicherleck ;))
Delphi-Quellcode:
unit main;
... function ShowBinary(var Data: Pointer; Count: Cardinal): TStrings; implementation {$R *.dfm} procedure TForm1.readBtClick(Sender: TObject); var Stream: TFileStream; begin Stream := TFileStream.Create('D:\Test.txt', fmOpenRead or fmShareDenyNone); try Stream.Seek(0, soFromBeginning); Stream.Read(Data[0], 128); Stream.Position := 0; Memo1.Lines.AddStrings(ShowBinary(Stream.Memory, Stream.Size)); finally FreeAndNil (Stream); end; end; // ShowBinary stammt von [url]http://www.swissdelphicenter.com/de/showcode.php?id=944[/url] // Wurde nur leicht modifiziert um TStrings zurück zu geben... function ShowBinary(var Data: Pointer; Count: Cardinal): TStrings; var line: string[80]; i: Cardinal; p: PChar; nStr: string[4]; const posStart = 1; binStart = 7; ascStart = 57; HexChars: PChar = '0123456789ABCDEF'; begin result := TStringList.Create; p := @Data; line := ''; for i := 0 to Count - 1 do begin if (i mod 16) = 0 then begin if Length(line) > 0 then result.Add(line); FillChar(line, SizeOf(line), ' '); line[0] := Chr(72); nStr := Format('%4.4X', [i]); Move(nStr[1], line[posStart], Length(nStr)); line[posStart + 4] := ':'; end; if p[i] >= ' ' then line[i mod 16 + ascStart] := p[i] else line[i mod 16 + ascStart] := '.'; line[binStart + 3 * (i mod 16)] := HexChars[(Ord(p[i]) shr 4) and $F]; line[binStart + 3 * (i mod 16) + 1] := HexChars[Ord(p[i]) and $F]; end; result.Add(line); end; |
Re: Daten aus einem Stream lesen und darstellen
Hallo,
Dein Aufruf von ShowBinary() ist falsch. Auch dort musst Du Data[0] als ersten Parameter übergeben. Das erklärt auch, wieso die zweite, eigentlich falsche Variante des Aufrufs von Stream.Read() zuerst zu funktionieren scheint: Du überschreibst hier den Bereich, an dem Deine lokalen Variablen (und die Rücksprungadresse) liegen, und liest diesen Bereich in ShowBinary() wieder aus. Beim Verlassen von readBtClick() scheppert's dann. jkr |
Re: Daten aus einem Stream lesen und darstellen
Zitat:
|
Re: Daten aus einem Stream lesen und darstellen
@Nuclear-Ping: Dein Code klappt so auch nicht, da du eine Property nicht als Var Parameter angeben kannst.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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