Binäres Lesen aus Datei - (Endian-Problem?)

26/10/2008 - 14:43 von Andreas Eibach | Report spam
Hi,

Ich will grade was binàr aus einer Datei lesen mit fread() und bekomme alles
falschrum.
Es soll langwortweise gelesen werden. (Unrelevantes z. T. in Pseudocode.)

unsigned long *buf; ( 00000000..ffffffff)

int cnt = 0;
do
{
fread (buf, 0x04, 1, infile);

/*debug */
printf ("LW nr. %d gelesen, Pufferinhalt = %08x", cnt, *buf);
cnt++;
}
while !eof...

In der printf-Zeile wird der Puffer ausgegeben, und die Langwörter stimmen
zwar überein, aber nur wenn man den Pufferinhalt _byteweise_ von rechts nach
links liest. Statt orig. 0100fd09 in der Eingabedatei gibt er 09fd0001 aus.
Sieht für mich nach dem berühmten Endian-Problem aus.

Für das hab ich zwar eine "Lösung", aber die gefàllt mir nicht - irgendwie
sollte das eleganter gehen, als wenn man byteweise liest (unsigned char*
Puffer reicht dann natürlich) und sich das Langwort dann vom 0. bis 3. Byte
zusammenpuzzelt :-/
Wenn's aber nicht anders geht, mach ich auch das.

-Andreas
 

Lesen sie die antworten

#1 Hermann Riemann
26/10/2008 - 14:56 | Warnen spam
Andreas Eibach schrieb:

Ich will grade was binàr aus einer Datei lesen mit fread() und bekomme
alles falschrum.
Es soll langwortweise gelesen werden. (Unrelevantes z. T. in Pseudocode.)

unsigned long *buf; ( 00000000..ffffffff)

int cnt = 0;
do
{
fread (buf, 0x04, 1, infile);

/*debug */
printf ("LW nr. %d gelesen, Pufferinhalt = %08x", cnt, *buf);
cnt++;
}
while !eof...

In der printf-Zeile wird der Puffer ausgegeben, und die Langwörter stimmen
zwar überein, aber nur wenn man den Pufferinhalt _byteweise_ von rechts
nach links liest. Statt orig. 0100fd09 in der Eingabedatei gibt er
09fd0001 aus. Sieht für mich nach dem berühmten Endian-Problem aus.



Richtig. %08X gibt bei little endian (intel) umgekehrte Reihenfolge
von der im Speicher aus.
Das fread kann stehenbleiben, da es korrekt einliest.
Nur das printf sollte einzelnen bytes abgepasst werden.

Übrigens, long kann auch 8 byte lang sein.

Hermann
der nach einer lstat Làngenabfrage des öfteren ganze Dateien
in eine Puffer làdt, und diesen je nach Inhalt behandelt.

http://www.HermannRiemann.de

Ähnliche fragen