AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Manchmal könnte man in die Tischkante beissen....
Thema durchsuchen
Ansicht
Themen-Optionen

Manchmal könnte man in die Tischkante beissen....

Ein Thema von TSHObject · begonnen am 1. Sep 2024 · letzter Beitrag vom 3. Sep 2024
Antwort Antwort
TSHObject

Registriert seit: 29. Apr 2006
Ort: Schweiz
12 Beiträge
 
Delphi 12 Athens
 
#1

Manchmal könnte man in die Tischkante beissen....

  Alt 1. Sep 2024, 17:46
Delphi-Version: 5
Hallo,

ich versuche EXIF-Daten aus einer JPEG auszulesen.
Das möchte ich eigentlich selber hinbekommen (ja ich weiss es gibt CCR Exif).
Begonnen hatte ich mit TMemoryStream und bin auch recht weit gekommen.

Man kann mit TMemoryStream.Position die Position setzen und dann mit Read die Bytes lesen. Anschliessend muss man dann halt die "bytes" selber in den nötigen Typ wandeln, was recht mühsam sein kann.
Nun habe ich die Klasse TBinaryReader entdeckt, welche ganz tolle Methoden wie ReadInt16,ReadSingle,ReadDouble bereits anbietet.
Das ist ganz toll, aber leider gibt es keine Eigenschaft "Position"!!!!

Mach ich etwas falsch oder hat Embarcadero einfach die Eigenschaft TBinaryReader.Position vergessen?

Danke für eure Tips.

Geändert von TSHObject ( 1. Sep 2024 um 17:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#2

AW: Manchmal könnte man in die Tischkante beissen....

  Alt 1. Sep 2024, 17:56
Der TBinaryReader liest seine Daten ja aus einem Stream, der entweder beim Create übergeben oder implizit bei Übergabe eines Dateinamens erzeugt wird. Diesen Stream kannst du über das Property BaseStream erhalten und der hat dann schon ein Property Position.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TSHObject

Registriert seit: 29. Apr 2006
Ort: Schweiz
12 Beiträge
 
Delphi 12 Athens
 
#3

AW: Manchmal könnte man in die Tischkante beissen.... (gelöst)

  Alt 1. Sep 2024, 18:37
Perfekt, tausend dank!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#4

AW: Manchmal könnte man in die Tischkante beissen....

  Alt 1. Sep 2024, 19:48
Es gibt mehrere solcher verschachtelter Streams/Reader/Writer in Delphi.
Bei Einigen muß man aber aufpassen, da sie einen Cache bzw. Buffer nutzen.

Dieser TBinaryReader besitzt z.B. einen Cache für Char/String-Funktionen und ich weiß nicht, wie er auf sowas hier reagiert.
Wird oft für Vorschaufunktionen gemacht, oder wenn man die Länge vorher noch nicht kennt, z.B. bei Strings mit Terminator, anstatt vorangestellter Länge.

[add] Ohhh, aber du kannst Glück haben, denn was kann man da sehen?
Delphi-Quellcode:
function TBinaryReader.PeekChar: Integer;
var
  Position: Int64;
begin
  Position := FStream.Position;
  try
    Result := InternalReadChar;
  finally
    FStream.Position := Position;
  end;
end;


PS: Wenn man nur vorwärts springt und nie rückwärts, dann könnte man auch eine Skip-Funktion nutzen, bzw. "blind" die gewünschte Anzahl an Bytes lesen.
Das betrifft auch solche Streams, welche sich teilweise nicht beliebig umherschubsen lassen, wie z.B. einige Verschlüsselungs- und Komprimierungsstreams.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Sep 2024 um 19:58 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#5

AW: Manchmal könnte man in die Tischkante beissen....

  Alt 1. Sep 2024, 23:36
Mit dem Auslesen von EXIF kann man aber gern ein paar Jahre verbringen, Phil Harvey macht das seit über 20 Jahren. Ich bin da auch schon einige Zeit dran, aber mit jeder neuen Kamera, jedem neuen Handy erlebt man wieder Überraschungen, zuletzt jetzt mit dem Xiaomi 14 Ultra, wo die chinesischen Jungs wieder einen dicken Fehler hineinprogrammiert haben.

Sehe ich das richtig, dass man beim TBinaryWriter und TBinaryReader nicht die Endianess angeben kann? Das dürfte immer Microsoft sein, also BigEndian. Das ist aber zum Beispiel bei Sony nicht empfehlenswert.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Manchmal könnte man in die Tischkante beissen....

  Alt 3. Sep 2024, 14:40
TStream.ReadData(); ?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:38 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