![]() |
Anfänger Frage zu Byteweisem auslesen
Hallo,
ich hab Probleme die ganzen Bespiele mit dem auslesen von Binärdateien zu verstehen. Also, die Datei lese ich in einen Stream ein. Aber wie navigiere ich jetzt darin? Ich hab eine Beschreibung wie die Datei aufgebaut ist darin steht z.B. das die ersten 4Byte ein Plaintext sind, die nächten 4 Byte sind ein Int und dann folgen diverse stellen die 1 Byte sind. Wenn ich jetzt z.B das Integer haben möchte, wie navigiere ich jetzt genau an die Stelle und hole mir genau diese 4Byte? Kann mir das nochmal jemand erklären? Vielen Dank Dragi ...der hofft das mal zu verstehen :) |
Re: Anfänger Frage zu Byteweisem auslesen
Hai dragi,
in einem Stream kannst Du deine "Position" mit TStream.Posion := xxx setzen. Um jetzt etas aus dem Strem zu lesen kannst Du mir ja mal ![]() So könnte das dann aussehen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var myStream : TStream; i : Integer; begin myStream.Position := 3; // Auf das 4. Byte setzen. myStream.ReadBuffer(i , SizeOf (i)); // In "i" lesen. end; |
Re: Anfänger Frage zu Byteweisem auslesen
Versuchs mal so:
Delphi-Quellcode:
Edit: Hm, zu lahm :roll:
procedure TForm1.FormCreate(Sender: TObject);
var FS: TStream; i: Integer; begin FS := TFileStream.Create('datei.dat', fmOpenRead); try FS.Position := 3; FS.ReadBuffer(i, 4); finally FS.Free; end; end; |
Re: Anfänger Frage zu Byteweisem auslesen
Hol dir erstmal die Dateigröße, denn die benötigst du zum Auslesen der Datei.
Anschließend kannst du die Datei gepuffert auslesen. |
Re: Anfänger Frage zu Byteweisem auslesen
@bigg
warum muss ich denn die Dateigrösse haben? Ich hab eine Aufstellung in der nacheinander Beschreiben ist wie die Datei aufgebaut ist in Byte. Also: 4Byte Key, 4Byte Int, 1Byte Byte, 1Byte BYte, 4Byte Int, ... etc. Muss ich dann trotzdem die gesamtgrösse haben? |
Re: Anfänger Frage zu Byteweisem auslesen
die gesammtgröße brauchst du nicht wirklich, höchstens um abzuprüfen ob die datei wirklich groß genug ist und du nicht übers dateiende hinaus liest
|
Re: Anfänger Frage zu Byteweisem auslesen
Hallo,
ich habe es jetzt hinbekommen, aber ein kleines Problem habe ich noch. Kann es sein das der noemale PC/Delphi alles als little Endian speichert? Also Integer und so? Wenn ich jetzt
Code:
mache erhalte ich zwar einen Wert aber ich müsste eigentlich den Binärwert der 4 Bytes umkehren?! Ich weiss genau das an einer bestimmten Stelle der Integer Wert 1 rauskomme müsste, ich erhalte aber 16777216 was in Binärere Schreibweise 1000000000000000000000000 gibt. Wenn ich das jetzt umkehre habe ich genau 1. Alles Integer Werte haben so komische Ergebnisse obwohl ich an der richtigen Stelle auslese. Wie kann ich denn jetzt das ausgelesene umkehren?
FS.ReadBuffer(i, 4);
Vielen Dank Dragi |
Re: Anfänger Frage zu Byteweisem auslesen
Moin Dragi,
Du könntest die vier Byte einzeln auslesen, und dann in umgekehrter Reihenfolge wieder zusammensetzen, oder Du liest sie in der Reihenfolge aus wie sie in der Datei stehen, und überträgst sie dann entsprechend. Ein "Trick" wäre es für das Einlesen einen varianten Record zu verwenden:
Delphi-Quellcode:
Ungetestet, müsste aber funktionieren.
// nur das Wesentliche, das drumherum fehlt
type TcsBigEndian = packed record case byte of 0 : (abRead : array [1..4] of byte;); 1 : (dwResult : DWORD); end; var beWork : TcsBigEndian; begin fs.Read(beWork.abRead[1],4); // in richtiger Reihenfolge gelesen ShowMessage(IntToStr(beWork.dwResult)); end; |
Re: Anfänger Frage zu Byteweisem auslesen
Also entweder hab ich es nciht verstanden oder es funktioniert nicht. Ich bekomme die gleiche falsche Zahl raus :(
Irgendwie müsste man doch diese 4 Byte in umgekehrter Reihenfolge in den Speicher schreiben und dann diesen Breich auslesen und einem Integer zuweisen. Aber wie macht man sowas??? Gruss Dragi |
Re: Anfänger Frage zu Byteweisem auslesen
Moin Dragi,
es funktioniert nicht :gruebel: Aber so geht's:
Delphi-Quellcode:
fs.Read(beWork.abRead[4],1);
fs.Read(beWork.abRead[3],1); fs.Read(beWork.abRead[2],1); fs.Read(beWork.abRead[1],1); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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