вот нашел в своем проекте старом
str - указатель на строку которую будем преобразовывать
dst - указатель на буфер куда запишется результат
size размер буфера
por это походу порядок типа слева на право или справа налево
Код:
void ato(unsigned char *str,unsigned char *dst,size_t size,bool por=false)
{
#define BYTE(l,h) (((l)<<4)|((h)&0xFF))
size_t i=0,j=0;
unsigned char byte[1];
// преобразуем в строку в чила
for(i=0;i<size*2;i++)
{
if(str[i]>0x40){str[i]-=0x57;}else{str[i]-=0x30;}
}
// заполняем числами
if(por==false){j=size-1;}else{j=0;}
for(i=0;i<size*2;i+=2)
{
byte[0]=BYTE(str[i],str[i+1]);
dst[j]=byte[0];
if(por==false){j--;}else{j++;}
}
}
пример:
Код:
unsigned char str[]="22345200"; // типа 4 байта 22 34 52 00
unsigned long i;
ato(srt,(unsigned char *)&i,4);
ну а в твоем варианте в цикл надо добавить дополнительный i++;

чтобы перепрыгивать % а патом byte[0] обратно преобразовать в ASCII прибавляя 0x57 или 0x30 (30 вроде для цифр)
сейчас опять порылся и нашел свой старый проект на perl в котором есть функция обратного преобразования в URL вид
Код:
sub url
{
my $str=$_[0];
$str=~ s/(.)/"%".uc(sprintf("%2.2x",ord($1)))/eg;
return $str;
}
на Си это будет что-то типа
sprintf(&dst[k],"%%02X",str[i]); k+=3;