Newsgroup: it.comp.lang.c++
Titolo: Conversione da esadecimale a int

Salve!
Ho un problema che le mie scarse conoscenze di C non mi aiutano a
risolvere. Sto scrivendo, per esercizio, un programma che converta una
stringa inserita dall'utente usando le tabelle ASCII. Ho trovato nel
libro di McGraw Hill un codice molto bello che permette di trasformare
una stringa (nel mio caso un URL) in esadecimale con percentuali (che
detto per inciso viene accettato dai browser, è quello il mio scopo):
***** inizio codice *****
[...]
char string[300] = ""; // inzializza la stringa
char *p1;
[...]
cout << "Inserire l'URL da tradurre: ";
gets(string);
[...]
p1 = string;
while (*p1) printf("%c%x", '%', *p1++);
***** fine codice *****
Esempio:
http://hwupgrade.it
 diventa
%68%74%74%70%3a%2f%2f%68%77%75%70%67%72%61%64%65%2e%69%74
Il programma funziona senza problemi; adesso però il mio problema è
fare l'opposto! Dalla stringa
%68%74%74%70%3a%2f%2f%68%77%75%70%67%72%61%64%65%2e%69%74
ricavare 
http://hwupgrade.it
 e non so proprio come elaborare
l'algoritmo! L'unica cosa che mi viene in mente è costruire un array
bidimensionale (chiamiamolo ascii[128][2]), e inizializzarlo con i
valori esadecimali e decimale di ogni carattere ASCII per fare una
specie di tabella di conversione. Dopodiché paragorane ogni singola
cella di string con quello di ascii e avere la traduzione, ma mi pare
una cosa molto grezza. C'è un altro sistema più pratico, magari
utilizzando i puntatori come nel primo problema? E già che ci sono...
c'è un sistema per far inizializzare automaticamente ascii[128][2]?
Magari usando un ciclo for? 
Spero di essermi spiegato chiaramente, e grazie in anticipo per
l'aiuto.
-- 
You know you're in trouble 
when there is nothing left on the altimeter 
but the maker's name

Ulisse31(da Vallina) ha scritto:

Se sai con sicurezza che ogni %xx e' un numero esadecimale puoi chiamare 
atoi usando come parametro xx (senza %, basta controllare nel modo 
giusto il puntatore) e poi operare sull'intero restituito, probabilmente 
con una funzione scritta da te perche' non credo che ci sia gia' 
qualcosa, per convertirlo in decimale. A questo punto basta assegnare il 
valore ottenuto a una variabile char, dato che quello e' gia' il codice 
ascii della lettera che vuoi ottenere.
Per inizializzare quell'array di cui parli, che comunque non ti dovrebbe 
servire puoi usare un ciclo for annidato in un altro:
for(int i=0;i<128;i++)
   for(int j=0;j<2;j++)
     fai qualcosa
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

     fai qualcosa
Sì, perfetto anche questo. Peraltro ci ripensavo proprio adesso: usare
l'array non servirebbe lo stesso perché il numero esadecimale è
rappresentato da DUE caratteri che stanno in celle diverse della
stringa... Comuqnue mi studio tutto e... vi farò sapere ^__-
Grazie per l'aiuto! Ciao.


 fare l'opposto!
   #include <iostream>
   #include <iterator>
   #include <string>
   #include <cstdlib>
 
   template< class It, class InsertIt >
   size_t 
   uri_decode( It beg, It end, InsertIt out )
   {
      size_t len = 0;
      char hex[3] = "";
      while( beg != end )
      {
         char c = *beg;
         if( c == '%' && ( end - beg ) > 2  )
         {
            hex[0] = *++beg;
            hex[1] = *++beg;
            c = std::strtol(hex,0,16);
         }
         else if( c == '+' ) c = ' ';
         *out = c;
         ++beg;
         ++len;
      }
      return len;
   }
 
 
   int main()
   {
      char src[] = 
          "%68%74%74%70%3a%2f%2f%68%77%75%70%67%72%61%64%65%2e%69%74";
 
      std::string dst;
 
      uri_decode( src, src+sizeof(src)-1, std::inserter(dst,dst.begin()) );
 
      std::cout << dst << std::endl;
 
   }
 
Max

Salve!
Ho un problema che le mie scarse conoscenze di C non mi aiutano a
risolvere. Sto scrivendo, per esercizio, un programma che converta una
stringa inserita dall'utente usando le tabelle ASCII. Ho trovato nel
libro di McGraw Hill un codice molto bello che permette di trasformare
una stringa (nel mio caso un URL) in esadecimale con percentuali (che
detto per inciso viene accettato dai browser, è quello il mio scopo):
***** inizio codice *****
[...]
char string[300] = ""; // inzializza la stringa
char *p1;
[...]
cout << "Inserire l'URL da tradurre: ";
gets(string);
[...]
p1 = string;
while (*p1) printf("%c%x", '%', *p1++);
***** fine codice *****
Esempio:
http://hwupgrade.it
 diventa
%68%74%74%70%3a%2f%2f%68%77%75%70%67%72%61%64%65%2e%69%74
Il programma funziona senza problemi; adesso però il mio problema è
fare l'opposto! Dalla stringa
%68%74%74%70%3a%2f%2f%68%77%75%70%67%72%61%64%65%2e%69%74
ricavare 
http://hwupgrade.it
 e non so proprio come elaborare
l'algoritmo! L'unica cosa che mi viene in mente è costruire un array
bidimensionale (chiamiamolo ascii[128] [2]), e inizializzarlo con i
valori esadecimali e decimale di ogni carattere ASCII per fare una
specie di tabella di conversione. Dopodiché paragorane ogni singola
cella di string con quello di ascii e avere la traduzione, ma mi pare
una cosa molto grezza. C'è un altro sistema più pratico, magari
utilizzando i puntatori come nel primo problema?
Spero di essermi spiegato chiaramente, e grazie in anticipo per
l'aiuto.
-- 


