![]() |
Teil-Records aus Stream lesen
Hi,
Also sagen wir ich hätte sowas:
Delphi-Quellcode:
Wenn ich jetzt das Record aus nem Stream lesen will dann mach ich das ja so:
TTest = packed record
nein: Byte; ja: Word; end;
Delphi-Quellcode:
Wie mach ich das aber wenn ich ab dem zweiten Byte lesen will? Also wenn ich das erste Byte des Records nicht einlesen will... also theoretisch sowas:
Stream.Read(ATest,SizeOf(TTest));
Delphi-Quellcode:
So das in dem Beispiel die Variable "nein" nicht eingelesen wird... ?
Stream.Read(ATest+1,SizeOf(TTest)-1);
Ich hab da schon irgendwas versucht mit Pointern und hin und her aber das war Rumprobiererei und wurde auch nichtmal compiliert.. Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Hi,
das müsste doch so gehen
Delphi-Quellcode:
stream.Position:= stream.Position+ 1;
|
Re: Teil-Records aus Stream lesen
Hi,
nein so mein ich das nicht.. Im Stream steht das erste Byte nicht drin. Mein Record: ________ 1 | 2 | 3 | Das erste (rote) Byte will ich nicht auslesen. Sondern erst das zweite und dritte. Nur ich darf halt nicht die Speicherstelle des Records angeben sondern die Speicherstelle eins weiter. Also hinter der Variable "ja".. so das in diesem Beispiel nur "nein" geladen wird. Ich hoffe das war jetzt verständlich Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Hmm, da würde ich, sofern es nur ein kleiner Teil ist (hier nur das Word), dieses per Hand auslesen.
Wenn es ein größerer Record ist, würde ich alles Auslesen und danach die unerwünschten Bestandteile resette. mfG Markus Ähem Halt, ich raff gerade deine Grafik ... da hilft wohl nur die "Zu-Fuß-Variante", oder du nimmst einen zweiten Teil-Record, welchen du einliest und dann rüberschiebst in den richtigen. |
Re: Teil-Records aus Stream lesen
Nein das muss anders gehn.. Da könnt ich wetten.
|
Re: Teil-Records aus Stream lesen
Hallo,
hier ist ein eher defensiver Ansatz, der zunächst den Offset des ersten zu lesenden Recordelements berechnet. Aus diesem Wert und der Recordgröße ergibt sich die Anzahl der zu lesenden Bytes:
Delphi-Quellcode:
Gruß Hawkeye
var
Test : TTest; FieldOffset : Integer; ReadSize : Integer; begin FieldOffset := Cardinal(@Test.ja) - Cardinal(@Test); ReadSize := SizeOf(TTest) - FieldOffset; Stream.Read(Test.ja, ReadSize); end; |
Re: Teil-Records aus Stream lesen
Hi,
Also in Wirklichkeit hab ich sowas:
Delphi-Quellcode:
Ich hab jetzt mal sowas probiert...
TGIFHeader = packed record
Version: String[6]; Width: Word; Height: Word; //.. end; PGIFHeader = ^TGIFHeader
Delphi-Quellcode:
Das wäre meine Logik aber da bekomm ich bei FHeader := ... haue^^
var P: Pointer;
begin P := @FHeader; P := PPointer(Cardinal(P) + 1)^; // Da müsste ich doch beim ersten Zeichen von Version landen oder? SetLength(FHeader.Version,6); // Weil das allererste Byte ist ja das Byte wo die Länge drinsteht vom String AStream.Read(P,10); // Und das darf nicht überschrieben werden. FHeader := PGIFHeader(PPointer(Cardinal(P) - 1)^)^; ShowMessage(FHeader.Version); end; Gruß Neutral General |
Re: Teil-Records aus Stream lesen
Hallo,
was du laut Format-Spezifikation brauchst sieht eher so aus:
Delphi-Quellcode:
String[6] ist also auf jeden Fall falsch. Wenn du jeden GIF Block-Typ einzeln gemäß Spezifikation definierst, dann fällt dein Problem einfach weg, aber grundsätzlich funktioniert die von Hawkeye vorgestellte Methode.
type
TGIF_HEader = packed record Signature: array [0..2] of Char; Version: array [0..2] of Char; end; TGIF_LogicalScreenDescriptor = packed record LogicalScreenWidth: Word; LogicalScreenHeight: Word; Options: Byte; BackgroundColorIndex: Byte; PixelAspectRatio: Byte; end; // ... Grüße vom marabu |
Re: Teil-Records aus Stream lesen
Hi,
Ja ok danke.. Naja das Problem ist: Zitat:
|
Re: Teil-Records aus Stream lesen
Hallo Michael,
ich hatte dir unterstellt, dass du den feinen Unterschied zwischen String[6] und array [0..5] of Char nicht kennst - entschuldige. Dein Problem kannst du viel einfacher lösen:
Delphi-Quellcode:
Du brauchst kein getürktes Längenbyte.
type
TGIF_Header = packed record Signature: array [0..2] of Char; Version: array [0..2] of Char; end; procedure TDemoForm.ButtonClick(Sender: TObject); var gh: TGIF_Header; begin gh.Signature := 'GIF'; gh.Version := '89a'; ShowMessage(Format('<%s> <%s>', [String(gh.Signature), String(gh.Version)])); end; Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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