Aus 2 bytes(char) einen 16 bit oder int machen



  • Hallo zusammen,

    ich habe ein problem und zwar ich möchte zwei char(mit hexadezimal Werte) zusammen fügen und das Ergebnisse als int haben.

    so versuche ich es und bekomme aber falsche Ergebnisse

    int Syst;
    
    Syst= (OctetStuffReceiverfunt.str[10]<< 8)| (0xFF&OctetStuffReceiverfunt.str[11]);
    

    danke für eure Hilfe

    Ryoban



  • endianess beruecksichtigt ? oder was meinst du mit falschem wert ?
    ist der inhalt eines char z.b. '2' oder willst du wirklich den binaerwert verwenden ?

    Meep Meep



  • hallo Meep Meep

    Meep Meep schrieb:

    endianess beruecksichtigt ? oder was meinst du mit falschem wert ?
    ist der inhalt eines char z.b. '2' oder willst du wirklich den binaerwert verwenden ?

    Meep Meep

    ich möchte zum Beispiel aus 0x00 und 0x91 das int 145 bekommen dh Syst= 145
    ich bekomme aber -28160.

    Grüß

    Ryoban



  • #include <limits>
    
    int unsigned makeword( char unsigned const a, char unsigned const b )
    {
            return ( a << std::numeric_limits< char unsigned >::digits ) | b;
    }
    

    funktioniert toll.



  • Du musst deine chars nur zo unsigned char konvertieren, denn ansonsten werden bei der direkten Konvertierung zu int die neuen Stellen mit dem Vorzeichen bit gefuellt anstatt mit mit den gewollten Nullen (wenn char als signed betrachtet wird).



  • ich möchte zum Beispiel aus 0x00 und 0x91 das int 145 bekommen dh Syst= 145
    ich bekomme aber -28160.

    Dann hast du auf jeden Fall schonmal die Byte-Order vertauscht.



  • Hallo,

    Danke für eure Hilfe alle.

    hustbaer schrieb:

    ich möchte zum Beispiel aus 0x00 und 0x91 das int 145 bekommen dh Syst= 145
    ich bekomme aber -28160.

    Dann hast du auf jeden Fall schonmal die Byte-Order vertauscht.

    Ja da hattest du recht, Dumm von mir 😃 , danke

    Ich möchte diese int (Syst) als datagramm über TCP senden, am Empfänger bekomme ich dann aber anstatt z.B 145 der Ascii zeichen

    struct To_sendTcp {char data[20] ;} To_sendTcp;
    //OctetStuffReceiverfunt ist ein char array mit hex Wertes
    
    To_sendTcp.data[0]='D';
    To_sendTcp.data[1]='A';
    To_sendTcp.data[2]='T';
    To_sendTcp.data[3]='A';
    To_sendTcp.data[4]='#';
    To_sendTcp.data[5]=20;
    To_sendTcp.data[6]='0';
    memset(To_sendTcp.data+8,'-',1);
    To_sendTcp.data[9]=static_cast<int>(OctetStuffReceiverfunt.str[4]);
    To_sendTcp.data[10]='-';
    To_sendTcp.data[11]=static_cast<int>(OctetStuffReceiverfunt.str[5]);
    To_sendTcp.data[12]=' ';
    To_sendTcp.data[13]=OctetStuffReceiverfunt.str[6];
    To_sendTcp.data[14]=':';
    To_sendTcp.data[15]=(int)OctetStuffReceiverfunt.str[7];
    To_sendTcp.data[16]='#';
    To_sendTcp.data[17]=Syst;
    To_sendTcp.data[18]='#';
    To_sendTcp.data[19]=(int)OctetStuffReceiverfunt.str[12];
    

    ich bekomme etwas wie diese DATA#0«-�-Ì Ì:Ì# #Ì.

    hat eine von euch eine Ahnung wie ich das eintellen soll ?

    Grüß



  • ryoban schrieb:

    ich bekomme etwas wie diese DATA#0«-�-Ì Ì:Ì# #Ì.

    Und was hättest du statt dessen gerne?

    BTW: OctetStuffReceiverfunt enthält bei dir ganz sicher keine "hex werte".
    Wenn du Hex Werte willst, dann wirst du die selbst basteln müssen.



  • hustbaer schrieb:

    Und was hättest du statt dessen gerne?

    ich hätte eher gern so DATA#2003-07-12 14:29#145#62#70

    die int/dezimal werte sozugen.



  • Ja sowas hab ich schon vermutet.
    Dir ist wohl nicht klar dass char(20) nicht gleich "20" ist.

    20 ist ein Byte mit dem Wert 20.
    "20" sind zwei Byte mit den Werten '2' und '0'.
    Wobei '2' nicht 2 ist und '0' nicht 0.

    Guckst du
    http://www.ascii-code.com/
    http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
    ...



  • Noch ein kleiner Tip: ein Zeichen == ein Byte.
    "DATA#2003-07-12 14:29#145#62#70" ist 31 Zeichen lang.
    char data[20] ist 20 Bytes lang.

    Fällt dir was auf?



  • Payload klingt so nach metasploit.



  • Wo steht hier was von Payload? 😕


Log in to reply