Wie von Byte nach unsigned short casten?



  • Hallo,

    ich lese mehrere Bytes von der Seriellen Schnittstelle in einen Puffer ein.
    Aus diesem Puffer möchte ich jetzt ab einer bestimmten Stelle den Inhalt in eine unsigned short Variable speichern.
    Ich habs schon mit memcpy probiert, aber das klappt auch nicht.

    Hier ist mal mein Code:

    byte gbIncomingBuffer[PHYSICAL_MAX_DATA_LEN];
    
    UINT CCommunication::ReadfromBridge(LPVOID pParam)
    {
       ...
       //Abspeichern der ankommenden Bytes in gbIncomingBuffer;  
       //funktioniert
       ...
       // in gbIncomingBuffer steht:gbIncomingBuffer={0,3,255,121,...}
    
    ProcessData();
    
    }
    
    void CCommunication::ProcessData(void)
    {
       byte *pBufferPosition=&gbIncomingBuffer[0];
       unsigned short usvar1;
       unsigned short usvar2;
       memcpy( &usvar1, pBufferPosition, sizeof(usvar1));
       pBufferPosition+=sizeof(usvar1);
       memcpy( &usvar2, pBufferPosition, sizeof(usvar2));
       pBufferPosition+=sizeof(usvar2);
       ...
       ...
       //in usvar1 steht alles andere als 3 drin 
       //und in usvar2 soll 65401 stehen, ist es aber nicht
    }
    

    Wisst ihr vielleicht eine Lösung?

    mfg

    plugpnray



  • Könnte es sein, daß du ein Problem mit big-endian vs. little endian hast? (wenn ja, solltest du die Werte 768 bzw. 31231 dort stehen haben)

    Ansonsten könnte es natürlich sein, daß du vergessen hast, ReadFromBridge() aufzurufen, oder daß sizeof(short) größer als 2 ist.



  • Ja, 768 und 31231 stehen drin.
    Dann muss es wohl ein Problem mit little- bzw. big-Endian geben.

    Weißt du, wie ich die Bytes dann getauscht kriege??



  • versuch's mal mit elementarer Bit-Arithmetik:

    short val=(pos[0]<<8)&pos[1]);
    pos+=2;
    


  • Okay, danke.

    Ich werds mal probieren.



  • Tut mir leid, aber ich kriegs einfach nicht gebacken. 😕

    Könntest du mir noch einen kleinen Schlag auf den Hinterkopf geben, für den Denkanstoß?



  • *schaut sich das Fragment nochaml genauer an*
    *klopft sich selbst auf den Hinterkopf*

    Sorry, mein Fehler - es müsste natürlich "(pos[0]<<8)**|**pos[1]" lauten.



  • Ha, ich habs anders hingekriegt.

    Und zwar klappt es wunderbar mit htons und, falls man die lange Version braucht, auch mit htonl.

    Die Funktionen werden zwar etwas missbraucht, aber es klappt wunderbar.

    Danke trotzdem.



  • plugnpray schrieb:

    Die Funktionen werden zwar etwas missbraucht, aber es klappt wunderbar.

    nee, dafür sind sie da. im gegensatz zu cstoll's code ändern die die werte nur auf little-endian gurken.


Anmelden zum Antworten