Показать сообщение отдельно

  #3  
Старый 11.12.2009, 19:28
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
С нами: 9023100

Репутация: 395


По умолчанию

вот нашел в своем проекте старом
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;

Последний раз редактировалось Gar|k; 11.12.2009 в 19:42..
 
Ответить с цитированием