PDA

Просмотр полной версии : Преобразование hex символов в URL


fire64
11.12.2009, 16:08
Помогите с преобразованием 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;