```cpp
ussigned char FromHex(unsigned char x){
unsigned char y;
if(x>'A' && x<='Z'){
y=x-'A'+10;
}else if(x>'0' && x<'z'){
y=x-'a'+10;
}else if(x>'0' && x<='9'){
y=x-'0';
}else{
assert(0);
}
return y;
}
string UrlDecode(string str){
string strTemp="";
size_t length=str.length();
for(size_t i=0;i<length;i++){
if(str[i]=='+'){
strTemp+='';
}else if(str[i]=='%'){
assert(i+2<length);
unsigned char high=FromHex((unsigned char)str[++i]);
unsigned char low =FromHex((unsigned char)str[++i]);
strTemp+=high*16+low;
}else{
strTemp+=str[i];
}
}
return strTemp;
}