Newsgroup: it.comp.lang.c++
Titolo: Conversione esadecimale ad ascii

Salve ragazzi, sto scrivendo una classe in vui devo eseguire una
conversione  esadecimale del tipo "ff07202980620110bd" nella relativa
stringa in ascii o binaria "ÿ  )€b  ¼".
Riesco a farlo usando la  HexToBin della VCL, ma il problema è che lo
devo
fare in c++ standard, avete qualche esempio da propormi per favore.
Di seguito riporto il relativo codice funzionate ma
usando la funzione della Vcl.
  int iBufSize;  
  char* cBuffer; // Buffer
  iBufSize = strlen("ff07202980620110bd") /2;
  cBuffer  = new char[iBufSize];
  memset(cBuffer, '\0' , iBufSize);
 
  HexToBin(cComando, cBuffer, iBufSize);

 stringa in ascii o binaria "ÿ  )?b  ¼".


 stringa in ascii o binaria "ÿ  )€b  ¼".
#include <string>
#include <stdexcept>
namespace string_utils
{
namespace priv_
{
char hex_chunk_to_char(std::string::const_iterator i, size_t chunk_size)
{
     char out =0;
     for(int a=0;a!=chunk_size;++i,++a)
     {
          if( !std::isxdigit(*i) )
              throw std::invalid_argument( std::string(1,*i) );
          out += *i << a*4;
     }
     return out;
}
}
std::string str2bin(const std::string& hex)
{
     if( hex.size() == 0 ) return "";
     std::string::const_iterator i = hex.begin();
     std::string::const_iterator e = hex.end();
     std::string out;
     out.reserve( hex.size()+1 /2 );
     if( hex.size() %2 != 0)
     {
         out.push_back( priv_::hex_chunk_to_char(i,1) );
         std::advance(i,1);
     }
     while( i != e )
     {
         out.push_back( priv_::hex_chunk_to_char(i,2) );
         std::advance(i,2);
     }
     return out;
  }
}
#include <iostream>
int main()
{
     try
     {
         std::cout
           << string_utils::str2bin("441424300444546")
           << std::endl;
	std::cout
           << string_utils::str2bin("")
           << std::endl;
	std::cout
           << string_utils::str2bin("this string is fucked up")
           << std::endl;
     }catch(const std::invalid_argument& ex)
     {
         std::cout << "cannot convert: " << ex.what() << std::endl;
     }
}

 }
la vecchiaia...
namespace priv_
{
char char_hex_to_bin(char the_char)
{
      if( std::isdigit(the_char)) return the_char - '0';
      return std::toupper(the_char) - 'A' + 10;
}
char hex_chunk_to_char(std::string::const_iterator i, size_t chunk_size)
{
     char out =0;
     for(int a=chunk_size;a!=0;++i)
     {
          if( !std::isxdigit(*i) )
              throw std::invalid_argument( std::string(1,*i) );
          out|= char_hex_to_bin(*i) << (--a)*4;
     }
     return out;
}
}
-- 
sbi

 fare in c++ standard, avete qualche esempio da propormi per favore.
#include<iostream>
#include<sstream>
int main()
{
    using namespace std;
    istringstream iss("ff07202980620110bd");
    while (iss) {
	char c[2];
	iss >> c[0];
	iss >> c[1];
	stringstream s(c);
	unsigned v;
	s >> hex >> v;
	cout << char(v) << endl;
    }	
}
-- 
alef

tutto molto bello,
ma (supponendo che il codice esadecimale sia giusto)
non bastava una cosa tipo:
// entra h ed esce s
void HexToS(char *s, char *h)
{
   int stp=0, sh=4;
   *s=0;
   while (*h)
     {
       *s|=(isalpha(*h)?toupper(*h)-'A'+10:*h-'0')<<sh;
       *(s+1)=0; s+=stp; stp=1-stp; sh=4-sh; h++;
     }
}
ciao,
g.
-- 
AIUTARE= Accrescere il numero degli ingrati
(Ambrose Bierce, Il Dizionario del Diavolo)

 g.
-- 
sbi

 "410042"
su queste stringhe dovrebbe funzionare.
La prima e' nulla quindi a parte mettere a zero il primo carattere di s
non viene fatto nulla (perche' il primo *h vale zero).
anche nella seconda non vedo problemi. Viene eseguita normalmente e
genera 3 caratteri ascii ( piu' uno zero finale che c'e'sempre.)
Il fatto che venga generato uno zero come secondo carattere di s
non e' un problema, visto che comunque la lunghezza del risultato
non puo' essere calcolata come strlen(s), ma come strlen(h)/2,
per la possibile presenza di zeri.
Caso mai spiegami meglio perche' non ho capito.
ciao,
(comunque il tuo programma e' meglio, il mio era solo
una piccola provocazione da digitatore pigro...)


 }
Ringrazio tutti per il gentile aiuto offerto, mi avete aiutato molto.