AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Teil-Records aus Stream lesen

Ein Thema von Neutral General · begonnen am 28. Jul 2007 · letzter Beitrag vom 29. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 13:53
Hi,

Also sagen wir ich hätte sowas:

Delphi-Quellcode:
TTest = packed record
  nein: Byte;
  ja: Word;
end;
Wenn ich jetzt das Record aus nem Stream lesen will dann mach ich das ja so:

Stream.Read(ATest,SizeOf(TTest)); 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+1,SizeOf(TTest)-1); So das in dem Beispiel die Variable "nein" nicht eingelesen wird... ?
Ich hab da schon irgendwas versucht mit Pointern und hin und her aber das war Rumprobiererei und wurde auch nichtmal compiliert..

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 14:04
Hi,
das müsste doch so gehenstream.Position:= stream.Position+ 1;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 14:15
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#4

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 14:25
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.
Markus
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 14:26
Nein das muss anders gehn.. Da könnt ich wetten.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 14:27
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:
var
  Test : TTest;
  FieldOffset : Integer;
  ReadSize : Integer;
begin
  FieldOffset := Cardinal(@Test.ja) - Cardinal(@Test);
  ReadSize := SizeOf(TTest) - FieldOffset;

  Stream.Read(Test.ja, ReadSize);
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 14:36
Hi,

Also in Wirklichkeit hab ich sowas:

Delphi-Quellcode:
TGIFHeader = packed record
  Version: String[6];
  Width: Word;
  Height: Word;
  //..
end;
PGIFHeader = ^TGIFHeader
Ich hab jetzt mal sowas probiert...

Delphi-Quellcode:
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;
Das wäre meine Logik aber da bekomm ich bei FHeader := ... haue^^

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 15:33
Hallo,

was du laut Format-Spezifikation brauchst sieht eher so aus:

Delphi-Quellcode:
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;

// ...
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.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 16:17
Hi,

Ja ok danke.. Naja das Problem ist:

Zitat von GIF Dateispezifikation:
Byte Nr. 0 - 5: "GIF87a" Version. Bislang gibt es GIF87a und GIF89a.
Deswegen hab ich nen String[6] definiert...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Teil-Records aus Stream lesen

  Alt 28. Jul 2007, 16:33
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:
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;
Du brauchst kein getürktes Längenbyte.

Freundliche Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 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