Entwickler-Ecke

Dateizugriff - HILFE mit Cardinal


SHIFTER - So 06.04.03 22:33
Titel: HILFE mit Cardinal
Hallo,

ich habe eine Datei 4Byte Gross inhalt = 00 00 01 E6

Ich muss diese Datei auslesen in 32 Byte Format also Cardinal.

Das Problem ist das nach dem auslesen bekomme ich E6 01 00 00
und nich das was in der Datei Stekt.

Kann ich das Irgendwie Convertieren damit ich den gewünschten ergebnis bekomme ?

Wer kann mir da behilflich sein ?

Gruss
Seba


Delete - Mo 07.04.03 08:01

Unter Windows werden Daten in dieser Form gespeichert. Zuerst kommt das niederwertigste Byte, am Ende das höherwertigste. Darum wird aus der Zahl $e6010000 beim Speichern auch

Quelltext
1:
00 00 01 E6                    

Das ist also kein Fehler. Ein Fehler wäre das "Konvertieren" (das Umdrehen der Bytes). Wenn es sich wirklich um eine Zahl (32Bit) handelt, dann kannst du davon ausgehen, dass der Wert $e6010000 der richtige ist. Vorausgesetzt die Datei, in der der Wert gespeichert ist, stammt ursprünglich auch von einer Windows-Plattform.

Ich habe es erst kürzlich erwähnt [http://www.delphi-forum.de/viewtopic.php?t=9320]: soweit ich weiß, wird beim Mac genau "umgekehrt" gespeichert. Wie das bei Linux ist, weiß ich nicht.

Dadurch ergibt sich für dich lediglich die Aufgabe, herauszufinden, ob die Datei plattform-übergreifend ausgetauscht werden kann/muss/soll, oder ob es sich nur um eine Windows-Datei handelt.

Du kannst übrigens ein Experiment machen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  f : file;
  iInt : integer;
begin
  AssignFile(f,'test.tmp');
  ReWrite(f,1);

  iInt := $01020304;
  BlockWrite(f,iInt,sizeof(integer));
  CloseFile(f);
end;

Kannst ja im Hex-Editor mal schauen, wie der Wert $01020304 gespeichert wird. :)


SHIFTER - Mo 07.04.03 11:03
Titel: Hallo,
Es handelt sich hier um eine JPEG datei und um genau zu sein um ein Exif Header. Es werden in den Exif Header mehrere Digi Cam's eingenschaften gespeichert. In dem Header werden nur Art der eingenschaft und der Offset ( als 32 Bit Adresse ) gespeichert und um diesen Offset Handelt sich.
Ich weiss zu 100 % das es 32 Bit Zahl ist und das die zahl umgekehrt geschrieben ist.
Ich brauch jetzt eine möglichkeit die Zahl uimzukehren.

MfG
Seba


Motzi - Mo 07.04.03 12:20

Na dann versuch ich mich mal...

Quelltext
1:
2:
3:
4:
function SwapDWord(Value: DWord): DWord;
begin
  Result := (Value shr 24) or ((Value and $00FF0000) shr 8) or ((Value and $0000FF00) shl 8) or ((Value and $000000FF) shl 24);
end;


Delete - Mo 07.04.03 12:48
Titel: Re: Hallo,
SHIFTER hat folgendes geschrieben:
Es handelt sich hier um eine JPEG datei und um genau zu sein um ein Exif Header. (...) Ich weiss zu 100 % das es 32 Bit Zahl ist und das die zahl umgekehrt geschrieben ist.

Wenn du gleich gesagt hättest, dass es um ein spezielles Dateiformat geht, dann hätte ich mir die Erklärung sparen können.

Zitat:
Ich brauch jetzt eine möglichkeit die Zahl uimzukehren.

s. Motzis Code


SHIFTER - Mo 07.04.03 13:36
Titel: Hi,
Sorry MathiasSimmack ich wuste nicht ob das irgend ein unterschied macht.

Die routine von Motzi hat echt 100%-ig funktionier also
ich möchte mich für eure hilfe herzlich bedanken.

MfG
Sebastian Launer


Delete - Mo 07.04.03 13:44

Na ja, einen Unterschied macht es durchaus.

Bei einem definierten Dateiformat musst du dich genau an dieses halten. Und wenn eben der besagte Offset "verkehrt herum" gespeichert ist, dann musst du als Programmierer das natürlich auch berücksichtigen.
Andernfalls liest du den falschen Offset, bzw. du erzeugst beim Schreiben falsche Werte.

Da du aber nur geschrieben hast, dass du eine Datei mit einem 32-Bit-Wert hast, bin ich davon ausgegangen, dir wäre das Speicherverhalten von Windows (bzw. der FATxx/NTFS) nicht klar.

Aber lass ma´. Is´ ja nicht so wild. Kriegt eben Motzi den Punkt. :wink:


Motzi - Mo 07.04.03 14:01

MathiasSimmack hat folgendes geschrieben:
Kriegt eben Motzi den Punkt. :wink:

Sind wir jetzt etwa schon am Punkte zählen? ;)
Naja, bin trotzdem froh das der Code funktioniert hat obwohl er nur mal frei aus dem Kopf raus war.. :roll: 8)


SHIFTER - Mo 07.04.03 14:14

Ich Danke euch beiden nochmal, es war mir echt grosse hilfe.

Also ihr punkte jäger ab an die arbeit den nächsten zu helfen ! :wink:

Gruss aus Sonnigen Wuppertal

Seba