codierte URL decodieren

Sebastian L

Grünschnabel
Hey,

oft werden URLs in Mails oder sonstwo codiert und zwar zb die URL

203.197.204.155
in etwas wie:
20%33.1%397.2%30%34.%315%35

oder auch sowas hier:
%65%7a%68%6f%6d%65%7a.us

Wie man sieht handelt es sich um "%" und dann denn HexWert. Ich habe das ganze als String (auch die Ziffern in der Domain) und die beiden Zeichen einzeln in einen neuen String zu kopieren, das wuerde ich wohl auch hinbekommen, aber wie komme ich jetzt moeglichst einfach zu einem dekodierten String, der die Klarurl ergibt bzw. wie kann ich die zwei Zeichen (beispielsweise "7a") in den richtigen Buchstaben umwandeln?

Ich nehme an das ist wieder supereinfach, aber irgendwie fehlt mir der Ansatz ..

Gruss
S.

PS: Ich werde wenn ich fertig bin die komplette Routine posten, damit andere auch was davon haben ;)
 
Im C++ Builder, falls du den irgendwo rumliegen hast geht das mit der Bibliotheksfunktion 'HttpDecode'.

Im wesentlichen mußt du nur einen Hex to Char Konverter schreiben, der
jeweils die zwei Zeichen hinter dem % in einen char wandelt.

char HexStringToChar( char* sHex )
{
char erg = 0;

for( int i = strlen( sHex ) - 1 ; i >= 0 ; i-- )
{
switch( sHex[ i ] )
{
case a: erg = erg * 16 + 10; break;
case b: erg = erg * 16 + 11; break;
....
case f: erg = erg * 16 + 15; break;

default: erg = erg * 16 + i; break;
}
}

return erg;
}

du mußt dir jetzt nur noch deine URL parsen:
1. die einzelen Werte in Strings kopieren,
2. diese Strings mit der obigen Funktion in char wandeln
3. und diese chars dann in einen Zielstring schreiben.

das wars dann.

Vorsicht, in einer URL können auch normale Zeichen vorkommen. Deshalb
muß dein Parser nur im Fall der % dekodieren und in den Zielstring übertragen,
alle normalen Zeichen kannst du direkt in den Zielstring kopieren.

Ich hoffe das ist jetzt nicht zu verwirrend. Ich hab irgendwo den kompletten Code
in auf CD rumliegen (in ANSI C), wenn du nicht klarkommst, melde dich...

Greets,
BadMourning
 
BadMourning hat gesagt.:
Im C++ Builder, falls du den irgendwo rumliegen hast geht das mit der Bibliotheksfunktion 'HttpDecode'.

Im wesentlichen mußt du nur einen Hex to Char Konverter schreiben, der
jeweils die zwei Zeichen hinter dem % in einen char wandelt.

Ich habs jetzt glaub ich auch ganz gut mit sscanf geloest .. hier der komplette Code .. Wichtig ist die Abfrage, die sicherstellt, dass es sich um gueltige Hexwerte handelt ...


Code:
int urldecode (char *urltodecode)
{
	long i = strlen(urltodecode);
	long a=0,b=0;
	long x=0;
	long laenge=0;
	
	char *t  = NULL;
	char t2[5]="\0";

	//allokieren
	laenge = strlen(urltodecode);
	t =  (char *)malloc(laenge+10);
	
	//wenn allokieren fehlgeschlagen 
	if( t == NULL ) return 0;
	t[0] = '\0';
	
	if(i<0) return 0;

	while(b<i)
	{
		if	(	urltodecode[b]=='%' && 
				(
					(
						urltodecode[b+1]>='a' && 
						urltodecode[b+1]<='f'
					)
					||
					(
						urltodecode[b+1]>='A' && 
						urltodecode[b+1]<='F'
					)
					||
					(
						urltodecode[b+1]>='0' && 
						urltodecode[b+1]<='9'
					)
				)
				&&
				(
					(
						urltodecode[b+2]>='a' && 
						urltodecode[b+2]<='f'
					)
					||
					(
						urltodecode[b+2]>='A' && 
						urltodecode[b+2]<='F'
					)
					||
					(
						urltodecode[b+2]>='0' && 
						urltodecode[b+2]<='9'
					)
				)

			)
		{
			b+=1;
			sscanf(urltodecode+b,"%2x",&x);
			t2[0]=(char)x;
			t2[1]='\0';
			strcat(t,t2);
			b+=2;
		}
		else
		{
			strncpy(t2,urltodecode+b,1);
			t2[1]='\0';
			strcat(t,t2);	
			b+=1;	
		}

	}

	strcpy(urltodecode,t);
	return 1;
}

Und wenn die Einrueckungen stimmen wuerden, dann saehe es auch nicht ganz so beaengstigend aus ;)

Gruss
S.
 
Zurück