fgetc() und unsigned long im little endian



  • hi folks!

    bin gerade dabei, mich mit echten zahlen > 255 in binärfiles auseinanderzusetzen....

    will also große werte mit fputc() schreiben und mit fgetc() auslesen...

    habe bisher rausgefunden, das mit little endian das system so aussieht:

    (unsigned??) char = eine stelle 1's.
    unsigned short = erste stelle 1's, zweite stelle 256's.

    geht soweit auch gut. nur ab hier bin ich verwirrt:

    denn sizeof() zeigt mir sowohl für int als auch für long 4 bytes an.
    dachte immer long wäre 8 bytes!?

    egal, habs einfach mal mit int probiert. demnach wäre:

    unsigned int = erste stelle 1's, 2. st. 256's, 3. st, 65536's, 4. stelle 16777216's....

    aber auf diese art und weise bekomme ich immer was falsches raus, wenn ich versuche, ein mit fwritef() geschriebenen integerwert wieder zu dekodieren....

    zudem gabs beim compilen einen fehler, sagte irgendwas von wegen 'truncated integer'.....

    geschrieben habe ich mit "fwritef(ofp, sizeof(int), 1, intWert);", wobei intWert irgendwas über 2 milliarden war....

    sieht da vielleicht jemand nen fehler, oder liege ich schon theorethisch falsch?



  • Nein, ein long ist 4 Byte groß, das passt schon so.

    So im allgemeinen kannst du bei Little Endian schon sagen:

    32BitWert = 1.Byte + 2.Byte*0x100 + 3.Byte * 0x10000 + 4.Byte * 0x1000000

    oder besser
    32Bit Wert = 1.Byte | 2.Byte<<8 | 3.Byte<<16 | 4.Byte<<24

    flexibel liese es sich auch so formulieren
    while (/* Byte sucessfully readed */)
    {
    MultiByteWert<<=8;
    MultiBypteWert+=Byte;
    ...
    }



  • ah ja.... ich nehme dann mal an das int und long in ANSI C (zumindest auf nem x86) identisch lang sind?



  • hi, soweit ich weiss ist int so gross wie die prozessor register (oder umgekehrt oO) ... also ist int auf nem 16 bit system von frueher 16 bit gross ... auf nem 32 bit system eben 32 bit ... und auf nem 64bit system eben 64bit... also isses nicht ANSI C abhaengig sondern eben CPU abhaengig...

    Gruessle TDO



  • danke 🙂



  • ein long long int hat (glaube ich) 64 bit.

    du kannst ja mal mit unions oder pointern rumspielen. wenn du nen long int speichern willst, nimm fwrite() und speichere die 4 bytes gleich in einem rutsch.
    dann musst du dich nicht unbedingt mit bytefolge rumschlagen. kann aber dann sein, dass die ausgabe nicht plattformportabel ist.



  • c.rackwitz schrieb:

    kann aber dann sein, dass die ausgabe nicht plattformportabel ist.

    eben , und darum geht es mir u.A...

    zudem: im schlimmsten falle könnte ich dabei was lernen 😃

    zumal es mir weniger um das schreiben, als um das einlesen geht...



  • kannst ja mal sowas machen:

    int foo = 0x40414243; printf("%s - %c", (char*)&foo, ((char*)&foo)[0]);
    

    nachtrag: das %s kann müll produzieren. besser ist es so:

    int i;
    for (i = 0; i < 4; ++i) printf("%c", ((char*)&foo)[i]);
    


  • der fehler in

    fwritef(ofp, sizeof(int), 1, intWert);
    

    ist, daß vor intWert ein '&' muß. hast du aber warscheinlich mittlerweile schon selbst rausgefunden 😉


Log in to reply