convert to dec



  • Hallo zusammen

    Ich habe ein kleines Problem:
    Wie kann ich das:

    char caTest[10]
    caTest[0]=0x00;
    caTest[1]=0x00;
    caTest[2]=0x03;
    caTest[3]=0xB7;
    

    in ein int conventieren?

    int iTest
    iTest|=caTest[0];  iTest<<=8;
    iTest|=caTest[1];  iTest<<=8;
    iTest|=caTest[2];  iTest<<=8;
    iTest|=caTest[3];
    

    Leider kommt nicht 3070 babei raus...
    Kann mir jemand sagen wie es richtig / am einfachsten geht?





  • Danke funktioniert jetzt

    iTest|=(caTest[0]<<24);
      iTest|=caTest[1]<<16;
      iTest|=caTest[2]<<8;
      iTest|=caTest[3]&0xff;
    

    Gruss Binggi



  • Sicher?
    Setzt mal bei caTest[2] einen Wert >= 0x80 ein.

    Du solltest iTest vorher initialiseren oder auf das erste | verichten.



  • falsch gedacht...
    Hast recht. Wie geht es denn richtig?
    Der Fall dass caTest[2] < 0x80 wird trifft bei meinem Programm gar nie zu, aber wäre trotzdem froh und die richtige Lösung.Und ev noch eine Erklärung wieso es nicht funktioniert.
    iTest ist initialisiert... war nur ein ausschnitt aus dem Code.



  • char hat i.A. ein Vorzeichen. Das wird für die Berechnung (<<) auf int erweitert.
    -1 = 0xff (char) = 0xffffffff (int32_t)

    iTest|=((caTest[0] & 0xff)<<24);
    iTest|=((caTest[1] & 0xff)<<16);
    ...
    

    Wenn du da keine Zeichen verarbeitest, nimm lieber uint8_t bzw. int8_t statt char.



  • Ok Danke.
    Man lernt immer noch dazu.

    DirkB schrieb:

    Wenn du da keine Zeichen verarbeitest, nimm lieber uint8_t bzw. int8_t statt char.

    Ich bekomme diese Daten über RS232 (Modbus-Protokoll) im RTU-Modus. Da geht nur char * zum die Daten auslesen. Aber danke für den Hinweis.



  • Wenn du weißt was du tust, darfst du dein uint8_t Array auch nach char* casten.

    Du könntest auch die Adresse von iTest übergeben, aber da passt die Endianess nicht. (Das kann man dann mit ntoh() wieder richtigstellen)


Log in to reply