Wiedermal string nach *char



  • Ja ich weiß es gibt sehr viele Beiträge zu diesem Thema, allerdings passt keines so wie ich es mir vorstelle!

    Ich habe einen string mit 178 Zeichen.

    Beispiel:
    03456789ABCDEF10111213141516171.........

    das soll dann in einem char auc[178] abgespeichert werden

    auc[0] = 0x0
    auc[1] = 0x3
    auc[2] = 0x4
    auc[3] = 0x5
    auc[4] = 0x6 usw.

    Hab das schon mit strstream probiert, aber erhalte da dann nur immer den Wert für das Zeichen z.B '3' 0x33.

    unsigned char uc;
    strstream str_string( string.c_str( )); 
    str_string >> hex >> uc;
    

    Gibt es noch irgend einen Manipulator den ich da einsetzen könnte?
    Oder, wo liegt mein Fehler?

    Danke Stumpf



  • Wenn ich Dich richtig verstanden habe, willst Du einen std::string in ein char-array speichern. Das kann man z.B. so machen:

    #include <cstring>
    #include <string>
    
    int main()
    {
        std::string a = "abcdefghig";
        char b[178];
        strcpy(b, a.c_str());
    }
    

    Alternativ kann man auch direkt auf die einzelnen Zeichen im String zugreifen:

    std::string a = "sdfsdfsdfdf";
    for(int i = 0; i < a.size(); ++i)
    {
        std::cout << a[i] << '\n';
    }
    


  • Stumpf schrieb:

    ...aber erhalte da dann nur immer den Wert für das Zeichen z.B '3' 0x33....

    Klar ! Ist es doch auch.

    Wenn schon, dann geben herkömmliche Tastaturen nur die Alt-Taste zur Eingabe von nichtdruckbaren Zeichen an.
    "0x3" ist ein String und wenn Du den eingeben, aber am Ende in einem char den Wert 0x3 stehen haben möchtest, kommst Du um eine explizite Umwandlung nicht herum.
    Also: Zeichenweise den String einlesen, Zeichen auf Wert abbilden ('3' -> 3) und dann Halbbytes zusammenfassen (0x10*0x3 + 0xa -> 0x3a).

    Gruß,

    Simon2.



  • Ich habe mein Problem anscheinend nicht korrekt beschrieben.

    Ich bekomme aus einem String folgende Daten

    30A035

    das sind HEX Daten 0x30 0xA0 0x35 entsprechen also den Werten 48, 160 und 53

    Diese Werte sollen dann auch in dem Array stehen:

    auc[0] = 0x30 --> 48
    auc[1] = 0xA0 --> 160
    auc[2] = 0x35 --> 53

    Das heißt ich muss immer zwei Zeichen einlesen als Hex bewerten, und dann im Array abspeichern. Aber wie?

    Ich glaub ich seh gerade den Wald vor lauter Bäumen nicht!



  • In diese Richtung?

    unsigned char uc;
    stringstream s( str.substr(0, 2) );
    s >> hex >> uc;
    


  • Stumpf schrieb:

    ....
    Das heißt ich muss immer zwei Zeichen einlesen als Hex bewerten, und dann im Array abspeichern. Aber wie?...

    äh - genau das habe ich doch beschrieben:

    Simon2 schrieb:

    Also: Zeichenweise den String einlesen, Zeichen auf Wert abbilden ('3' -> 3) und dann Halbbytes zusammenfassen (0x10*0x3 + 0xa -> 0x3a).

    Oder von mir aus im Code

    static map<unsigned char, unsigned int> char2Val;
       char2Val['0'] = 0; char2Val['1'] = 1; char2Val['2'] = 2; char2Val['3'] = 3;   char2Val['4'] = 4; char2Val['5'] = 5; 
       char2Val['6'] = 6;   char2Val['7'] = 7;    char2Val['8'] = 8; char2Val['9'] = 9;   char2Val['a'] = 10;   char2Val['A'] = 10; 
       char2Val['b'] = 11;  char2Val['B'] = 11;   char2Val['c'] = 12; char2Val['C'] = 12;  char2Val['d'] = 13;   char2Val['D'] = 13; 
       char2Val['e'] = 14;  char2Val['E'] = 14;   char2Val['f'] = 15; char2Val['F'] = 16; 
    
       unsigned char array[10];
       string str = "30A035";
    
       size_t i;
       for(i=0;i<3; ++i) {
          array[i] = 0x10*char2Val[str[2*i]] + char2Val[str[2*i+1]],
          cout << hex << array[i] << " ";
       }
    

    (OK, das mit der map kann man noch schöer machen, aber es geht hier ums Prinzip)

    Gruß,

    Simon2.

    EDIT: Lord's Variante ist natürlich schöner. 😋



  • Vielleicht bin einfach nur zu blöd!

    inline unsigned char ConvertHexStringToChar( std::string str_string )
    {
      unsigned char uc;
      stringstream istr_string = str_string.c_str();
      istr_string >> hex >> uc; 
      return( uc );
    }
    

    Er schmeißt mir hier die Meldung raus!
    error C2440: 'initializing' : cannot convert from 'const char *' to 'std::basic_stringstream<_Elem,_Traits,_Alloc>'

    Er kann den String nicht zuordnen.



  • Du solltest auch nicht nach Belieben den hier vorgestellten Code ändern .... 🙄 🙄

    Kann doch nicht so schwer sein, 3 Zeilen abzutippen....

    Gruß,

    Simon2.

    P.S. kleiner Tipp: Lord's Code erzeugt Dir natürlich nur EIN Byte ... für n Bytes musst Du ihn entsprechend oft anwenden (und Dir überlegen, welcher SubString dabei jeweils verwendet werden soll).
    kleiner Tipp2: Denk gleich an Fehlerbehandlung ....



  • OK

    hab's gesehen!

    Bin zu blöd Sorry !!!

    Danke nun denke ich sollte es gehen!

    Gruß
    Stumpf


Anmelden zum Antworten