String und Maskieren geht das?



  • Hi

    Ich möchte gerne eine Reihe von Binärwerten die mir als String übergeben werden auswerten.
    Gibt es eine möglichkeit die Bitstellen mittels Bitoperationen direkt zu manipulieren, also darauf zb. XOR, OR oder AND anwenden oder müsste ich den Inhalt erstmal irgendwie in ein Zeichenfeld umwandeln und dann in eine Art Register packen? Und wie müsste ich da vorgehen?
    Könntet ihr mir da einpaar Tipps geben?

    mfg



  • da Strings ja als char Arrays implementiert sind ist das kein Problemm.
    binäre Operationen auf char gehen imho wunderbar.

    was hast du denn genau vor?



  • Hi

    danke für deine Antwort.
    Also ich möchte gerne Busdaten auslesen (Modbus). Diese sind CRC16 codiert. Ich möchte gerne die Daten erstmal decodieren. In der Modbus Spezification ist angeben wie man den Datenstrom decodiert. Hier mal der Code:

    [code]

    unsigned char *msg; //A pointer to the message buffer containing binary
    //data to be used for generating the RCR

    unsigned short usDataLen; //The quantity of bytes in the message buffer

    unsigned short CRC16(msg, usDataLen)
    {
    unsigned char *msg;
    unsigned short usDataLen;
    unsigned char uchCRCHi=0xFF;
    unsigned char uchCRCLo=0xFF;
    unsigned uIndex;

    while(usDataLen--){

    uIndex=uchCRCHi^*msg++;
    uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
    uchCRCLo=auchCRCLo[uIndex];
    }
    return (uchCRCHi<<8 | uchCRCLo);

    }

    Wobei in auchCRCHi[] und auchCRCLo[] spezielle 16 Bit Prüfsummen abgelegt sind.
    was ich noch nicht richtig verstanden habe ist was genau die 1. Zeile der while-Schleife macht bzw. um auf meine Frage bezug zu nehmen, verstehe nicht, wie man Binärwerte die in der obigen Form vorliegen (1. Zeile der while Schlefe) mittels Bitoperationen manipuliert 😕



  • Du meinst *uIndex=uchCRCHi^msg++; ?

    Da steht *uIndex = uchCRCHi ^ msg++;

    ^ ist das bitweise Oder
    Mit * greifst du auf den Inhalt der Speicherstelle zu, auf die der Zeiger weist.
    ++ ist der Postinkrement. Der Inhalt der Variablen wird erhöht nachdem der Wert benutzt wurde.

    Du nimmst den Inhalt auf den msg weist (danach wird der Zeigerwert um 1 erhöht) und veroderst ihn mit uchCRCHi.

    Klassisch: uIndex = uchCRCHi ^ msg[i]; i++; // Wenn i der Index/Schleifenzähler ist

    Ein char array wird zu einem String (laut Vereinbarung) wenn es mit '\0' abgeschlossen ist. Du hast Binärwerte drin, deshalb solltest du nicht mit Stringbefehlen arbeiten.


Anmelden zum Antworten