Problem mit Typumwandlung



  • Folgendes Problem ereilte mich, für welches ich bisher keine Lösung finden konnte:

    Ich übermittle per CGI aus einem HTML-Textfeld heraus einen Text in ein Character-Array auf einem Mikrocontroller.
    HTML besitzt die Eigenart, Sonderzeichen in den Hexadezimalen ASCII-Code umzuwandeln.
    Nun gilt es, den Hexadezimalen Wert wieder in einen einzelnen Character zu überführen um ihn daraufhin per kprintf auf der Seriellen Schnittstelle auszugeben.

    Hier der bisher logischste, aber nicht funktionsfähige Ansatz:
    Die Variable Text beinhaltet den Text, welcher per CGI übergeben wird.
    Ein Sonderzeichen wird immer mit % eingeleitet, gefolgt von dem Hexadezimalen ASCII-Code.
    Die zwei HEX-Zeichen des jeweiligen Sonderzeichens werden gefiltert und in das gesonderte Array temp geschrieben, von wo aus sie dann in einen Character gewandelt werden sollen

    char ascii[3];
    char temp;
    char text[]="test%33%1F"; //ein Hexadezimalwert wird immer von '%' eingeleitet
    int i=0;

    while (text[i]!='\0')
    {
    if(text[i]=='%')
    {
    ascii[0]=text[i+1];
    ascii[1]=text[i+2];
    i+=2;
    sscanf(ascii,"%x",&temp);
    kprintf("%c",temp);
    }
    }



  • es fehlt der string-terminator

    ascii[0]=text[i+1]; 
    ascii[1]=text[i+2]; 
    ascii[2]=0;
    

    Kurt



  • Danke für die schnelle Antwort!!!

    nur noch eine kleine Frage vorweg: muß da nur ne 0 rein oder \0?

    nochmals Danke, JOBA



  • ganz richtig wäre '\0', aber in c tuts auch 0;
    Kurt



  • Leider hat das auch nicht zum Erfolg geführt 😞 .

    alles was jetzt bei der konvertierung auf dem Terminal ausgegeben wird, ist ein schwarzer Smilie.

    Noch ne Idee? Verzeifeln schon seit Tagen daran. DAs muß doch irgendwie zu lösen sein.



  • Wahrschinlich liegts daran das "%X" beim sscanf ein integer velangt.
    bei mir funktionierts folgendes programm einwandfrei

    #include <cstdio>
    #include <cstring>
    
    int main() {
    	char ascii[3]; 
        int temp; 
        char text[]="test%33%1F"; //ein Hexadezimalwert wird immer von '%' eingeleitet 
        int i=0; 
    
        while (text[i]!='\0') { 
            if(text[i]=='%') { 
    			ascii[0]=text[i+1]; 
    			ascii[1]=text[i+2]; 
    			ascii[2]=0; 
    			i+=2; 
    			sscanf(ascii,"%x",&temp); 
    			printf("%s = '%c' = %d \n",ascii, (char)temp, temp); 
    		} 
    		else 
             i++;
    	}
    }
    

    output ist

    33 = '3' = 51
    1F = '▼' = 31
    

    Kurt



  • ZuK schrieb:

    if(text[i]=='%') { 
    			ascii[0]=text[i+1]; 
    			ascii[1]=text[i+2]; 
    			ascii[2]=0; 
    			i+=2; 
    			sscanf(ascii,"%x",&temp); 
    			printf("%s = '%c' = %d \n",ascii, (char)temp, temp); 
    		} 
    		else 
             i++;
    	}
    }
    

    so ist's etwas einfacher

    if(text[i]=='%') 
            { 
                sscanf (&text[i+1], "%x", &temp);
                printf("%x = '%c' = %d \n",temp, (char)temp, temp); 
            } 
            i++;
    

    edit: ausserdem wird in in der schleife immer um eins erhöht --> dann kann die 0 nie verpasst werden



  • Leider funktioniert auch das nicht. wir bekommen immer den schwarzen smilie.
    das will einfach nicht funktionieren.
    Liegt das evtl am Compiler? Wir Lassen das Programm auf einem ZILOG eZ80 laufen. Das DevelopmentStudio versteht nur ANSI-C.



  • nochmal zu deiner letzten variante:

    das kann bei uns nicht funktionieren, da im array text[] mehrere sonderzeichen vorkommen können. wenn ich das mit &text[i+1] mache, dann versucht der doch alles was nach einem % kommt als hex zu interpretieren. was passiert also bei folgendem array inhalt:

    text[]="%20%F1%60%22weitererinhalt";

    mann, wäre ich frof, wenn ich endlich eine lösung hätte. drehe langsam wirklich am rad! 😡



  • joba schrieb:

    was passiert also bei folgendem array inhalt:
    text[]="%20%F1%60%22weitererinhalt";

    das macht nix. sscanf hört auf wenn ein zeichen kommt, dass keine hexziffer ist. aber nimm besser "%02x" statt "%x". der original zilog compiler soll übrigens nicht so toll sein. versuch mal den iar



  • 😃 Super, '%2X' war die gesuchte Lösung. Funzt jetzt!

    Jetzt haben wir nur noch ein kleines Problem, das gewandelte Zeichen in ein neues Array (ziel[]) zu übergeben und danach auszugeben.
    Hier der Code:

    [cpp]
    
    int i,j,k;
    char ascii[3]; 
    char temp; 
    char[161];
    
    for (k=0; k<=160; k++)
    ziel[k]=0;
    ziel[160]='\0';
    
    if (text[i]=='%')
    {
                ascii[0]=text[i+1]; 
                ascii[1]=text[i+2]; 
                ascii[2]=0; 
                sscanf(ascii,"%2X",&temp); 
                ziel[j]=temp;
                j++;
                i+=3;
    
    }
    
    kprintf ("\n %s \n",ziel);  
    
    [/cpp]
    

    Das Problem ist nun, dass die printf Anweisung nun jeweils nur ein 's' anstelle jedes zu wandelnden Zeichens ausgibt.

    HILFE


Anmelden zum Antworten