Autor Beitrag
SHIFTER
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Win 2k SRV, Win XP, Vista, SuSe Linux SRV
Delphi 11
BeitragVerfasst: So 06.04.03 22:33 
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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ausblenden 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: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Win 2k SRV, Win XP, Vista, SuSe Linux SRV
Delphi 11
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 07.04.03 12:20 
Na dann versuch ich mich mal...
ausblenden 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;

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Win 2k SRV, Win XP, Vista, SuSe Linux SRV
Delphi 11
BeitragVerfasst: 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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
SHIFTER Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

Win 2k SRV, Win XP, Vista, SuSe Linux SRV
Delphi 11
BeitragVerfasst: 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