BYTEweises Einlesen und Umwandeln in INTEGER



  • Hallo,

    ich lese aus einem File byteweise ein. Das mach ich mit read(...)

    char temp[5]; 
    input.read(temp, 4);
    

    Funktioniert soweit. Nun die Frage: Ich möchte diese 4 Byte (Bsp) nun als Integer interpretieren. Wie mache ich das auf elegante Art und Weise?

    Vorschlag:

    int value = 0; 
    
    for (i=0; i<4; i++)
    {
      value = value << 8; 
      value += static_cast<int>(temp[i]);
    }
    

    Da ich mit dem cast-Operator nicht vertraut bin, bitte ich um Kommentare. Desweiteren: Können Probleme mit signed int auftreten?

    Gruß,
    Göbel



  • int value=*static_cast<int*>(temp);
    

    da du das ergebnis schon in temp stehen hast, musst du nur das array anders interpretieren.



  • otze schrieb:

    int value=*static_cast<int*>(temp);
    

    da du das ergebnis schon in temp stehen hast, musst du nur das array anders interpretieren.

    Ok, das Prinzip ist mir klar. Warum arbeitest du jedoch mit Zeigern?
    Leider motzt auch der Compiler:

    cannot convert from 'char [5]' to 'int *
    

    Weiterer Vorschlag?

    Danke,
    Göbel



  • Tipp ins Blaue:
    reinterpret_cast ?



  • ja, der is es-wie immer.

    dass ich die c++ casts immernoch verwechsel 🙄



  • Der reinterpret_cast stellt zwar den Compiler ruhig, aber sinnvolle int-Werte erhalte ich dadurch nicht.

    Weitergrübeln,
    Göbel



  • horc schrieb:

    Der reinterpret_cast stellt zwar den Compiler ruhig, aber sinnvolle int-Werte erhalte ich dadurch nicht.

    Weitergrübeln,
    Göbel

    Tipp ins Blaue2:
    Falsche Byteorder? (Little Endian / Big Endian)



  • @interpreter: Dein "Tip ins Blaue2" ist richtig.

    Besten Dank,
    Göbel



  • Wenn das auch so beim Lottospielen klappen würde... 😃



  • Ich würde es so machen, obwohl Du dann immer noch auf Bytorder achten musst!

    int value;
    input.read( (char*)&value, 4 );
    


  • Jetzt bin ich doch noch nicht glücklich. Angenommen, ich möchte eine Zahl byteweise zusammenbauen, a la:

    char array[size]; 
    int value = 0; 
    
    for (int i = 0; i < size; i++)
    {
        value = value << 8; 
        value = value | array[i]; 
    }
    

    Warum bekomme ich bisweilen riesige Zahlen zurück (4294967168) obwohl ich nur läppische 2 Byte eingelesen habe (0x0180). Liegt wohl am Zweierkomplement oder so, aber ich versteh es nicht wirklich. Wer hat eine Lösung?

    Gruß,
    Göbel


  • Mod

    das array als unsigned char deklarieren, oder eben ein static_cast<unsigned char>( array[i] )


Log in to reply