Преобразование hex символов в URL

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 11 Dec 2009.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    Помогите с преобразованием Hex символов содержащихся в URL в настоящие Hex символы

    Скажем ввожу я в адресную панель браузера строку


    Code:
    netbios://10.207.8.28/My Media
    В результате браузер запускает мою программу работающую с протоколом netbios://

    и передает в нее строку

    Code:
    netbios://10.207.8.28/My[B]%20[/B]Media

    Я у себя в программе использую следующий код

    Code:
    	int arglen = strlen(backupname);
    
    	for ( int i= 0; i < arglen; i++ )
    	{
    		FixHex(backupname);
    	}
    
    backupname содержи принимаемый прогой параметр

    Code:
    void FixHex( char *pname )
    {
    
    	bool havedhex = false;
    
    	while ( *pname ) 
    	{
    
    		if(havedhex)
    		{
    			*pname = *(pname + 2);
    		}
    
    		if ( *pname == '%' && *(pname + 1) == '2' && *(pname + 2) == '0')
    		{
    			*pname = '\x20';
    
    			havedhex = true;
    		}
    
    		pname++;
    	}
    }
    

    Но этот код служит только для преобразования %20 в пробел

    подскажите как сделать автоматическое преобразование хекс значений со знаком % в их настоящий вид
     
  2. DeaD_MoroZ

    DeaD_MoroZ Banned

    Joined:
    3 Nov 2009
    Messages:
    102
    Likes Received:
    7
    Reputations:
    0
    я не много не понял чо тебе надо... но посмотри вот http://forum.sources.ru/index.php?showtopic=37821
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    вот нашел в своем проекте старом
    str - указатель на строку которую будем преобразовывать
    dst - указатель на буфер куда запишется результат
    size размер буфера
    por это походу порядок типа слева на право или справа налево


    Code:
    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++;}
                    }
            }
    
    пример:
    Code:
    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 вид

    Code:
    sub url
    	{
    	my $str=$_[0];
    	$str=~ s/(.)/"%".uc(sprintf("%2.2x",ord($1)))/eg;
    	return $str;
    	}
    
    на Си это будет что-то типа
    sprintf(&dst[k],"%%02X",str); k+=3;
     
    _________________________
    #3 Gar|k, 11 Dec 2009
    Last edited: 11 Dec 2009