char-array nach WORD/DWORD



  • Hi,

    wie kann ich am effektivsten ein

    1. char-array mit 2 Elementen in WORD (unsigned short) und
    2. char-array mit 4 Elementen in DWORD (unsigned int) konvertieren ?

    Ich muss das so machen, weil ich eine Datei binär einlese (<fstream>.read()) und das in einem char-array gespeichert wird und ich dann verschiedene char-Folgen nach WORD bzw. DWORD konvertieren muss.



  • So haut es nur tw. hin, aber halt seltsamerweise nicht für alle Werte:

    char c2[2] = {0x00, 0x00};
     unsigned short s = (int)c2[1]*0xFF +(int)c2[0];
    

    ...auch wenn ich c2[1] und c2[0] vertausche passts nicht ganz.



  • Ah...so scheints jetzt hin zu hauen:

    char c2[2] = {0x02, 0x01};
     unsigned short s = (__int8)c2[0]*0x0100 +(__int8)c2[1];
    

    ohne (__int8) konvert. gehts eigentlich auch:

    unsigned short convertCharArrToUS(char c[2])
    {
            return c[0]*0x0100 +c[1];
    }
    

    Aber ist das auch sinnvoll das so zu machen ?



  • wie waers mit

    char* source = read();
    word w = *reinterpret_cast<word*>(source)++;

    und das am besten in ein template, damit du auch andere sachen auslesen kannst.

    dieses beschissene neue forum. ich hatte des grad schonmal geschrieben, dann auf c++code gedrueckt, dann war alles weg, nur [ c p p ] stand noch da. und jetzt ist der code tag knopf weg.



  • Ich muss das so machen, weil ich eine Datei binär einlese (<fstream>.read()) und das in einem char-array gespeichert wird und ich dann verschiedene char-Folgen nach WORD bzw. DWORD konvertieren muss.

    Warum liest du mit read() nicht einfach direkt in ein WORD bzw. DWORD? Benötigst du wirklich den Umweg über ein char-Array?



  • HumeSikkins schrieb:

    Warum liest du mit read() nicht einfach direkt in ein WORD bzw. DWORD? Benötigst du wirklich den Umweg über ein char-Array?

    Wenn ich wüsste, wie das gehen soll...ich habe es bisher nur so funktionieren sehen:

    char *data;
     unsigned long len = getFilesize(in);
     data = new char[len];
     in.read(data, len);
    

    read() erwartet doch ein char*, wie soll ich denn da einn word/dword rausbekommen ?



  • Wirf mal einen Blick bei den unions rein

    WORD Value;
    
    union test
    { 
    short int a;
    char b[2];
    }
    
    ......
    test.b[0]=char1;
    test.b[1]=char2;
    Value=test.a;
    

    Bei 4 Bytes geht das analog

    union test2
    { 
    int a;
    char b[4];
    }
    

    dadurch das ich die Reihenfolge der Zuweisung der Characters zur Union Steuern kann, sind auch Konvertierungen von
    Little nach Bug Endian únd umgekehrt möglich



  • Danke.
    Die Idee mit den Unions scheint ganz geeignet zu sein.



  • Hallo,
    was spricht gegen?

    int val;
    inFile.read((char*)&inval, sizeof(int));
    


  • ohja...eigentlich nix.
    naja, ich habe mich jetzt aber entschieden, die ganze datei erst in ein char-array zu lesen.

    aber Du hast recht, beim direkten auslesen spare ich durchaus zeit und speicher...ich muss mein prog nochmal überdenken...



  • (char*)

    🙄



  • @HumeSikkins

    ernsthafte Frage: Kann man so auch irgendwie little Endisn in Big Endian und umgekehrt umwandeln?



  • ernsthafte Frage: Kann man so auch irgendwie little Endisn in Big Endian und umgekehrt umwandeln?

    Ne. Das ist ja ein generelles Problem bei dieser Form der Persistenzhaltung. Speicherst du deinen int auf einem big-endian-System (ifstrem::write) und liest du dann aus der Datei auf einem little-Endian-System (ifstream::read), dann hast du natürlich ein Problem.
    Du musst also schon wissen, in was du hast und was du willst.

    Unregistrierter schrieb:

    (char*)

    🙄

    Besser wäre natürlich: reinterpret_cast<char*>(&val)

    Aber da ich hier nicht pro Buchstabe bezahlt werden, habe ich Bequemlichkeit über Qualität gesetzt 😃


Anmelden zum Antworten