Verständniss Problem mit fread



  • Hallo,

    ich tue mich schwer fread zu verstehen und habe im internet folgeneden code gefunden, den ich nicht verstehe:

    struct bmp_header
    {
        unsigned char magic_number[2];
        unsigned int bmp_file_size;
        unsigned int junk;
        unsigned int pixel_offset;
    };
    struct bmp_header *my_bmp_header;
    struct bmp_header buffer;
    int main(void)
    {
       fread(&buffer,sizeof(struct bmp_header),1,pIN);
       my_bmp_header = &buffer;
        if(my_bmp_header->magic_number[0]=='B' && my_bmp_header->magic_number[1]=='M')
            printf("Magic file number is: %c %c\n", my_bmp_header->magic_number[0], my_bmp_header->magic_number[1]);
    }
    

    Diese Datei die von Fread gelesen wird hat folgende Zeile im txt file:
    424D36003000(HEX Format)

    Also mein Problem:

    In der Struktur Komponente unsigned char magic_number[2] steht jetzt: BM
    In unsigned int bmp_file_size steht hetzt: 3245782
    Also mein Frage:
    fread liest ja nach Jürgen Wolf abhängig von der Prozessor Architektur, also entweder nach little endian oder nach big endian.
    Warum landen 424D in big endian Reihenfolge in unsigned char magic_number[2]
    und 3245782 in umgekehrter reihenfolge, also nach little endian in
    unsigned int bmp_file_size

    Und meine zweite Frage:

    Der Wert 3245782 kommt von 36003000, diese zahlen stehen umgekerht in HEX Format, wieso werden die in int werte umgewandelt, also ich weiß das
    unsigned int steht, aber wie kann die fread funktion wissen das der wert in hex steht und nicht in int???

    Ich hoffe Ihr könnt mir helfen.



  • Zur zweiten Frage:
    Integer kennen kein Hex Format. Integer sind "Zahlen" oder "Werte". Diese kann man repräsentieren wie man möchte (bin, dez, hex). Hier muss also nichts umgewandelt werden. Der einzige Unterschied ist jetzt dass dein HexEdit dir die Bytes in Hex anzeigt und der Debugger in Dezimal, das hat aber nichts mit der Zahl an sich zu tun diese ändert sich nicht.

    Zur ersten Frage:
    magic_number sind einfach 2 einzelne Bytes, welche keine endianness kennen. (Wie auch?)



  • transcend schrieb:

    fread liest ja nach Jürgen Wolf abhängig von der Prozessor Architektur, also entweder nach little endian oder nach big endian.

    wenn das im Buch genau so steht, dann ist das ein weiterer Grund, die Bücher dieses "Experten" nicht zu lesen, ich rate jedenfalls dazu, dieses Buch sofort wegzuschmeißen und das "erlernte" wieder schnell zu vergessen.

    fread liest nicht nach der Architektur, denn woher soll fread wissen, dass du Zahlen liest und ob sie 2, 4, 16, 32, 64, usw. Bit breit sind? Du liest nur ein Datemstrom, da können Strings, Zahlen, Datenmüll, alles mögliche drin sein. fread liest einfach byte für byte und legt sie genauso ab.

    Nimm einen hex editor und poste den Inhalt deiner zu lesenden Datei, sonst kann man nicht nachvollziehen, was da schief geht. Eventuell auch, wie die Datei überhaupt erzeugt wurde.



  • ok bitte der input des hex editors:

    424D360030000000000036000000

    danke für die antworten



  • Wieso schief geht? War denn ein anderes Verhalten gewünscht?



  • Was hat denn 36 00 30 00 mit 3245782 zu tun?

    36 00 30 00 als 32-bit unsigned LE Zahl gibt 0x00300036 und das sind 3145782 dez.



  • DirkB schrieb:

    Was hat denn 36 00 30 00 mit 3245782 zu tun?

    36 00 30 00 als 32-bit unsigned LE Zahl gibt 0x00300036 und das sind 3145782 dez.

    Woher weiß den die fread funktion im voraus, dass das eine hex zahl ist, kann ja auch eine dezimale zahl sein, oder???



  • Weil es schon erklärt wurde.

    cooky451 schrieb:

    Zur zweiten Frage:
    Integer kennen kein Hex Format. Integer sind "Zahlen" oder "Werte". Diese kann man repräsentieren wie man möchte (bin, dez, hex). Hier muss also nichts umgewandelt werden. Der einzige Unterschied ist jetzt dass dein HexEdit dir die Bytes in Hex anzeigt und der Debugger in Dezimal, das hat aber nichts mit der Zahl an sich zu tun diese ändert sich nicht.

    In der Datei steht ein Bitmuster. 8 Bits sind 1 Byte.
    Wenn du das Bitmuster 00001010 hast, sind das 0x0a oder 10 dez (oder 012 im Oktalsystem)

    int i = 65
    printf("dez: %2d\n", i); // 65
    printf("hex: %2x\n", i); // 41
    printf("char: %c\n", i); // A
    

    Es ist nur eine Darstellungssache.



  • du hast es immer nicht verstanden. Hex, Dez, Oct, Bin sind nur Darstellungen mit Zeichen, die wir Menschen brauchen, um die Werte lesen und verstehen zu können. Dass die Darstellung anders ist, heißt nicht, dass der skalare Wert sich ändert 😮

    Der Computer kennt nur eine Darstellung, Binär und ALLES wird stets binär gespeichert.

    fread weiß nichts, die Funktion liest einfach n-Bytes und schreibt sie in einen Puffer, und das m-Mal. Was in diesen Bytes stecken, kann fread nicht wissen, sie soll und sie braucht es auch nicht zu wissen. Es liegt am Programmier zu bestimmen/wissen, dass die ersten 4-Bytes z.b. ein int sind, die nächsten 10 Bytes ein String, die nächsten 6 nur Padding Bytes sind, usw.



  • supertux schrieb:

    ...

    Hm.. zu schnell (ge)/(ver)lesen? 😃



  • an alle:

    vielen dank für eure zeit und wissen, ich verstehe es jetzt und kenn mich endlich aus 😃


Log in to reply