Es geht hier um den Datentyp 5. Eigentlich soll er 8 Bytes lang sein mit 4 Bytes Zähler und 4 Bytes Nenner. Laut Spezifikation ist er "unsigned", müsste also 2 x Cardinal sein, denn es gibt ihn auch noch mit Vorzeichen als Typ 10.
Es ist aber keineswegs so, dass der Typ 5 immer nur 2 x 4 = 8 Bytes hat, zum Beispiel nicht bei den GPS-Werten. Bei GPSLongitude und GPSLatitude hat er 3 x 8 = 24 Bytes (das ist auch so bei EXIFTool vermerkt). Da könnte es bei deinem iPhone haken, weil es vermutlich GPS-Daten in die JPG schreibt. Daher ist deine Lösung nicht optimal an den Typ 5 angepasst.
Ich mache das ungefähr so (ist jetzt so dahingeworfen):
Delphi-Quellcode:
var Buff:TBytes;
Zähler,Nenner,DritterWert:Cardinal;
begin
SetLength(Buff,Length);
Move(Value^, Buff[0], Length);
Zähler := PCardinal(@TB[0])^;
Nenner := PCardinal(@TB[4])^;
If Length >= 12
then DritterWert := PCardinal(@TB[8])^;
end;
Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.