int von little endian nach big endian konvertieren



  • hi,

    wie kann ich eine long unsigned var vom little endian nach big endian konvertieren und in einer datei abspeichern?

    unsigned long test = 1062;
    fwrite(&test, 4, 1, fh);
    

    in der datei steht nun 0x26 0x04 0x00 0x00 ich möchte jedoch folgendes ergebnis erhalten: 0x04 0x26 0x00 0x00

    cu...



  • versuch's mal mit man: htonl und Konsorten.
    (oder zeig mit einem char* auf deine Zahl und lies sie rückwärts aus)



  • CStoll schrieb:

    versuch's mal mit man: htonl und Konsorten.
    (oder zeig mit einem char* auf deine Zahl und lies sie rückwärts aus)

    So wärs natürlich richtig. Er will aber was anderes 😉 ( siehe Beispiel )
    Kurt



  • dann bleibt wohl nur die Variante mit dem char* (entsprechend angepasst):

    char* testc = &test;
    char out[sizeof(unsigned long)];
    int l=strlen(testc);
    for(int i=0;i<l;++i)
      out[i]=testc[l-i-1];
    for(i=l;i<sizeof(unsigned long);++i)
      out[i]=0;
    fwrite(out,4,1,fh);
    


  • stdin schrieb:

    in der datei steht nun 0x26 0x04 0x00 0x00 ich möchte jedoch folgendes ergebnis erhalten: 0x04 0x26 0x00 0x00

    cu...

    müssten die Byte bei big endian nicht in der Reihenfolge 0x00 0x00 0x04 0x26 sein.

    #include <stdio.h>
    
    unsigned long Little2Big(unsigned long l)
    {
    		unsigned long b;
    
    		b = (l >> 24) & 255; 		
    		b |= (l >> 16) & (255 << 8);
    		b |= (l << 8) & (255 << 16);
    		b |= (l << 24) & (255 << 24);
    
    		return b;
    }
    
    int main() {
    		unsigned long l = 1062;
    
    		printf("little:\t0x%08lX\n", l);
    		printf("big:\t0x%08lX\n", Little2Big(l));
    
    		return 0;
    }
    


  • @homer1:

    müssten die Byte bei big endian nicht in der Reihenfolge 0x00 0x00 0x04 0x26 sein.

    hast recht, war mein fehler. deine funktion klappt wunderbar. ich werd mir diese mal genauer anschauen und noch für ein word anpassen 😃
    auch allen anderen ein danke 😉



  • Kleine Korrektur

    [cpp]
    unsigned long Little2Big(unsigned long l)
    {
    unsigned long b;

    b = (l >> 24) & 255L;
    b |= (l >> 8) & (255L << 8);
    b |= (l << 😎 & (255L << 16);
    b |= (l << 24) & (255L << 24);

    return b;
    }
    [/cpp]


Anmelden zum Antworten