Newsgroup: it.comp.lang.c++
Titolo: da stringa a ascii

Salve, è tutto oggi ke cerco una libreria o funzione ke mi trasformi
una stringa in codice ascii...(esempio questa: 10 10 10 10)
Qualcuno sà aiutarmi?
Thnx

 Qualcuno sà aiutarmi?
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef vector<unsigned int> V_UI;
const unsigned int char_to_ascii(const char& c) {
  return (unsigned int)c;
}
V_UI string_to_ascii(const string& s) {
  V_UI v(s.size());
  transform(s.begin(), s.end(), v.begin(), char_to_ascii);
  return v;
}
int main() {
   string a("CIAO!");
   V_UI v = string_to_ascii(a);
   for (V_UI::iterator it = v.begin(); it!= v.end(); ++it)
        cout << *it <<' ' ;
   cout << endl;
   return 0;
}


Tipo questa??? (scritta al volo, non testata...)  :-D
[CODE]
char *StrToASCII(char *sInput, char *sOutput) {
    char cCarattere, sBuffer[4];
    for (*sOutput = '\0'; ((cCarattere = *sInput++) != '\0'; )
            strcat(sOutput, itoa((int)cCarattere, sBuffer, 10));
    return sOutput;
}
...
Ciao! ;)

 }
forse sono all'antica, ma dov'e' il C++, qui?


Scusa, ma siccome non sono abituato a programmare in C++ (sto leggendo
questo gruppo per farmi una idea) mi puoi spiegare perche' usare tutto
l'ambaradan del C++ che hai usato tu (algorithm, vector, etc.etc.) per
scrivere una funzioncina di tre righe ??
Se proprio uno vuol fare una critica costruttiva al codice di Wizard,
puo' notare che
1) c'e' una parentesi di troppo prima di cCarattere (typo).
2) la funzione itoa forse non e' standard (nel mio compilatore non c'e')
3) facendo la conversione (int)cCarattere uno commette un errore se
il char e' maggiore di 128 (ASCII esteso) infatti in quel caso si
ottiene un numero negativo e siccome "-133\0" ha 5 caratteri si esce
dal buffer che e' stato definito a 4 char.
Questo problema c'e' anche nel tuo codice nella funzione char_to_ascii
che sbaglia per codici ascii estesi a piu' di 128.
A parte questo i due codici sono diversi perche' lui restituisce una
stringa con i codici ascii scritti dentro, tu restituisci un vettore
che e' in pratica il vettore di partenza solo con un cast applicato
ai vari elementi. In pratica la conversione in ASCII avviene solo quando
spari fuori i numeri nel cout.
In realta' non era chiaro fin dall'inizio cosa voleva Paolo....
Comunque, se uno non e' troppo schizzinoso
puo' anche scrivere (si, lo so che sprintf non e' efficiente...):
#include <stdio.h>
void Str2ASCII(char *in, char *out)
{
   for (*out='\0';*in;in++) out+=sprintf(out," %d",(unsigned char) *in);
}
Naturalmente questa e' una opinione personale e penso che
ciascuno debba regolarsi come meglio crede.
Ciao,
g.

 ciascuno debba regolarsi come meglio crede.
di nuovo, non e' c++, usa i puntatori, hai un ciclo, devi preoccuparti 
di allocare out alla giusta grandezza, nasconde possibili memory leak in 
caso di eccezioni. E potrei continuare... 
Per me, inoltre, il tuo codice e' molto meno intuitivo del leggere
  transform(s.begin(), s.end(), v.begin(), char_to_ascii);
gia' leggendo la riga di codice hai idea di cosa stai facendo, non trovi?

 massimo stamparne il valore.
mi e' rimasto un pezzo del msg nella mente:
se avessi voluto una stringa coi codici ascii sarebbe stato ancora 
meglio, avrei potuto usare <sstream>, altra funzionalita' poco nota ai 
piu', che renderebbe ancora piu' semplice il codice, basterebbe un 
for_each sulla stringa data che calcoli e inserisca l'unsigned int in un 
ostringstream, e restituire poi ostringstream.str()


Hai ragione Enrico, il mio era solo un esempio, ci sono molteplici maniere
di risolvere la questione...
Però non sappiamo Paolo cosa voleva esattamente: ha una CString o una
stringa "selvaggia" da convertire???
Boh... il mio era solo uno spunto scritto al volo...
Ciao a tutti! ;)
Sandro

 che non vengono utilizzate molto spesso
D'accordo su tutto.
Maurus

 un ostringstream, e restituire poi ostringstream.str()
solo una precisazione: per essere sicuri di effettuare la conversione 
char --> tipo intero in modo portabile sarebbe bene usare i char_traits:
typedef std::char_traits<char> traits;
traits::int_type code = traits::to_int_type('x');
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

Ciao a tutti e thnx x le risposte...allora il mio problema era x CString...
Ora visto ke siete tanto gentili e preparati vi propongo un'altra conversione :D
Da Hex a Bin...ci sta qualke classe inclusa oppure devo fare l'algo da solo??
Thnx cmq a tutti ^_^

 solo??
ho visto qualcosa a riguardo, mi sembra in Thinking in C++ di Eckel.
comunque, basta usare la seguente tabella
char  | stringa
 hex  |   bin
----------------
 0       0000
 1       0001
 2       0010
 3       0011
 4       0100
 5       0101
 6       0110
 7       0111
 8       1000
 9       1001
 A       1010
 B       1011
 C       1100
 D       1101
 E       1110
 F       1111