Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Преобразование hex символов в URL (https://forum.antichat.xyz/showthread.php?t=162694)

fire64 11.12.2009 16:08

Преобразование hex символов в URL
 
Помогите с преобразованием Hex символов содержащихся в URL в настоящие Hex символы

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


Код:

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

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

Код:

netbios://10.207.8.28/My%20Media

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

Код:

        int arglen = strlen(backupname);

        for ( int i= 0; i < arglen; i++ )
        {
                FixHex(backupname);
        }

backupname содержи принимаемый прогой параметр

Код:

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 в пробел

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

DeaD_MoroZ 11.12.2009 17:22

я не много не понял чо тебе надо... но посмотри вот http://forum.sources.ru/index.php?showtopic=37821

Gar|k 11.12.2009 19:28

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


Время: 05:53