CString in Hex



  • moin

    ich hab einen CString:

    cmd="00 00 00 00 00 0E 01 65 07 00 00 00 01 01 00 01 01 FF FF 00";
    dieser soll in einen CString umgewandelt werden in dem die werte wirklich als hex drin stehn ...

    ich beiß mir grad die zähne dran aus ...

    wie bekomm ich das hin ???
    thx für hilfe
    LT



  • Was genau meinst du mit "in dem die werte wirklich als hex drin stehn" ?
    Willst du einen Puffer, der die Daten als Binärwerte enthält?



  • also "wirkliche wert" im mom hab ich ein string der z.b. 00 besteht aus 2 zeichen ... den beiden nullen eben ... ich will das aus 00 der char wird der laut asccii tabelle hinter 00 steht also in dem fall 'nul' und das zeichen will ich an einen string anhängen ...

    sinn und zweck der geschichte: ich hab einen drucker der seine befehle über tcp bekommt diese tcp - befehle sind hex - anweisungen bestehend aus 20 zeichen...
    wenn ich nun meine socket-komunikation aufmache und was senden will brauch ich aber einen char buffer den ich an meine funktion übergeben muss...

    heist ich muss aus meinem string die leerzeichen filtern und dann die zeichen in chars umwandeln und diese dann an den charbuffer übergeben der sie so dann weg senden soll ... wenn ich mir die komunikation per wireshark angucke und einfach nen string weg schicke wandelt der 00 in 30 30 um ich will aber das da 1 zeichen steht das er in 00 umwandelt



  • Spontan würde mir z.B. strtol einfallen. Die Frage ist ja auch: warum hast du die Werte als String? Vielleicht kannst du an der Stelle schon ansetzen.



  • hmmm das bringts net ...
    ich will halt das ich in nem string stehn haben :

    aus:
    cmd="00 00 00 00 00 0E 01 65 07 00 00 00 01 01 00 01 01 FF FF 00";
    soll:
    cmd="'nul''nul''nul''nul''nul''so''soh''e''bel''nul''nul''nul''soh''soh''nul''soh''soh''FFh''FFh''null'";

    für ff gibt es kein darstellbares zeichen ...

    also wie bekomm ich das hin ?



  • Etwa so (ungetestet):

    #include <iomanip>
    #include <sstream>
    
    // ...
    
    std::istringstream in(cmd);
    std::ostringstream out;
    int x;
    
    while(in >> std::hex >> x) {
      out.put(static_cast<char>(x));
    }
    
    std::string cmd_transformed = out.str();
    

    Wenn's darum geht, dem Compiler einen solchen String unterzujubeln, benutz die \x##-Notation:

    char buf[] = "\0\0\0\0\0\x0e\x01\x65\x07\0\0\0\x01\x01\0\x01\x01\xff\xff";
    std::string cmd(buf, buf + sizeof(buf));
    


  • ok char buf[] = "\0\0\0\0\0\x0e\x01\x65\x07\0\0\0\x01\x01\0\x01\x01\xff\xff";
    hat gut funktioniert...
    nun will ich das n bisschen abändern:

    char *buf=NULL;
    		buf = new char[256];
    
    		int len=0;
    		CString cmd_a="", cmd_tmp="";
    
    		cmd_a="00 00 00 00 00 0E 01 65 07 00 00 00 01 01 00 01 01 FF FF 00";
    		CStringArray r2;
    		int iNum2 = ParseTokens( r2, cmd_a, " ");
    		if(iNum2>0){
    			len=iNum2;
    			for(int i=0; i<iNum2; i++){
    				CString erg;
    				erg="\x"+r2[i];
    				cmd_tmp=cmd_tmp+erg;
    			}
    		}
    

    leider funktioniert erg="\x"+r2[i]; nicht ... ich bekomm immer die fehlermeldung: error C2153: Hexadezimale Konstanten muessen mindestens eine hexadezimale Ziffer enthalten

    wie kann ich das umgehen ???
    mfg LT



  • Du kannst die "\x??" Notation nur für Literale benutzen, da der Compiler (oder Präprozessor?) die Textersetzung zur Übersetzungszeit vornimmt und nach "\x" einen Wert erwartet. Zur Laufzeit geht das so nicht.

    Du willst die Namenskürzel der Zeichen gemäß der ASCII Tabelle ausgeben? Dazu musst du dir wohl oder übel jedes Zeichen ansehen und den passenden String zurückgeben:

    std::string ASCII_name( char c )
    {
       // statisches Array aus Namen, musst du selbst füllen
       static std::string ASCII_NAMES[] = { "nul", "soh", "stx", "etx", /*etc, pp*/ };
    
       if( c < 128 )
       {
          return ASCII_NAMES[c];
       }
       return "";
    }
    


  • was soll dieses std:: eigentlich immer ???
    das geht unter vc++ net also so jedenfals net ...

    und wie soll ich aus z.b. 00 oder 0e nen char machen ...



  • LordTerra schrieb:

    was soll dieses std:: eigentlich immer ???
    das geht unter vc++ net also so jedenfals net ...

    Das ist der Namensraum in dem die String-Klasse (und auch der restkliche Standard C++ Kram) deklariert ist.



  • der funktioniert bei mir aber nicht ... ausserdem will ich kein string als rückgabewert sondern einen CString... sonst muss ich ja schon wieder hin und her casten ... ey das mit den datentypen in c++ is einfach nur nen kraus ...



  • Wenn du Hilfe zu den MFC willst, bist du im falschen Unterforum. Da willst du hin, scheint mir.



  • naja mfc is es ja nur bedingt ...



  • In Standard-C++ gibt es keinen CString. Du benutzt Visual C++. Wenn das nicht der CString aus den MFC ist, was ist es dann?

    Jedenfalls kann ich dir für den MFC-CString nicht so einfach eine Lösung hinrotzen wie weiter oben für std::string. Die Leute im MFC-Forum können es womöglich.


Anmelden zum Antworten