Bytes aus void Buffer auslesen



  • Hi,

    ich möchte gerne Daten aus einem Buffer auslesen. Diese beginnen immer mit einem "tag", dass die Bytelänge 1, 2, 3 oder 4 besitzen kann. Im nachfolgenden exemplarischen Code wird diese Bytelänge als Parameter "tagByteLen" übergeben.

    Momentan werden aus dem Buffer immer 4Byte für "tagLength" ausgelesen. Wie kann ich das in Abhängigkeit des übergebenen Parameter schreiben? Wenn dieser beispielsweise 2 ist, möchte ich in "tagLength" auch nur die ersten beiden Bytes vom Buffer stehen haben.

    uint32 getTagLength(tagByteLen)
    {
      void* buffer = getBuffer();  
      uint32 tagLength = *(uint32*)buffer; 
      return tagLength; 
    }
    

    VG
    Lars



  • vlt so:

    const uint8 *buf = (const uint8*)getBuffer();
    uint32 tagLength = 0;
    while(tagByteLen-- > 0) //runterzählen bis 0
    {
        tagLength |= *buf++; //8 bitz aus dem buffer lesen
        if(tagByteLen != 0) //bits außer bei letztem durchlauf
            tagLength << 8; //nach links schieben
    }
    

    ansonsten verwendest du naiv für jede bytezahl den entsprechenden datentyp.


  • Mod

    Was soll denn das Ergebnis sein, wenn du von deiner 4-Byte-Zahl 2 Bytes setzt? Mal angenommen, die beiden Bytes hätten die Werte 1 und 2, was und warum soll dann hinterher der Wert des uint32 sein?



  • SeppJ schrieb:

    Was soll denn das Ergebnis sein, wenn du von deiner 4-Byte-Zahl 2 Bytes setzt? Mal angenommen, die beiden Bytes hätten die Werte 1 und 2, was und warum soll dann hinterher der Wert des uint32 sein?

    Wenn der Bytestream vom Buffer beispielsweise "0x00 0x11 0x22 0x33 0x44 0x55" ist und "tagByteLen" mit zwei gesetzt ist, dann möchte ich im Ergebnis "tagLength" die ersten beiden Bytes 0x00 0x11 stehen haben. Im Prinzip legt "tagByteLen" fest, wieviele Bytes für die Längenangabe im Bytstream vom Buffer heranzuziehen sind - und das kann variieren.

    Anschließend muss unter Umständen noch konvertiert werden zwischen BE und LE, da der Bytestream vom Buffer immer BE ist.



  • roflo schrieb:

    vlt so:

    const uint8 *buf = (const uint8*)getBuffer();
    uint32 tagLength = 0;
    while(tagByteLen-- > 0) //runterzählen bis 0
    {
        tagLength |= *buf++; //8 bitz aus dem buffer lesen
        if(tagByteLen != 0) //bits außer bei letztem durchlauf
            tagLength << 8; //nach links schieben
    }
    
    {
        tagLength << 8; //immer nach links schieben
        tagLength |= *buf++; //8 bitz aus dem buffer lesen
    }
    


  • Kann man auch ganz ohne Bit-Operationen schreiben.

    { 
         tagLength *= 256;
         tagLength += *buf++;
    }
    

    Lars Käufer schrieb:

    Anschließend muss unter Umständen noch konvertiert werden zwischen BE und LE, da der Bytestream vom Buffer immer BE ist.

    Nicht wenn du es richtig machst.
    Die von roflo/volkard/mir gezeigte Einleseschleife funktioniert wenn die Bytes im Datenstrom in BE vorliegen, egal was die CPU auf der der Code läuft verwendet.


Anmelden zum Antworten