Newsgroup: it.comp.lang.c++
Titolo: esadecimale->binario

Ciao a tutti
dovrei leggere un file riga per riga (in ogni riga c'è una stringa
esadecimale) e scrivere su un altro file le stesse righe solo in formato
binario.. chi mi può dare una mano?
Grazie!!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 binario.. chi mi può dare una mano?
Il libro di testo? Le dispense del corso?
Questo sembra tanto un compito a casa. Prova a impostare il programma
per conto tuo e torna a chiedere di dubbi specifici.
Ciao,
Nicola

 per conto tuo e torna a chiedere di dubbi specifici.
No purtroppo non è un compito per casa.. è che il il c++ lo sto imparando da
poco ho cercato nelle funzioni strtol itoa e atoi ma a parte che le ultime
due non sembrano essere supportate dal mio compilatore gcc (forse sarà
vecchio ma che per vari motivi nn posso cambiare) ma senza successo, se
fosse in fortran imposterei il problema leggendo un carattere alla volta
della stringa character e lo trasformo "manualmente" in binario o qualunque
altra base voglio, qui in c++ non so bene come muovermi..?!
Grazie


 altra base voglio, qui in c++ non so bene come muovermi..?!
Che il GCC non supporti itoa e atoi mi pare VERAMENTE grossa... cerca
meglio.

Massimo Soricetti ha scritto:

non è che forse ha dei settaggi errati nelle opzioni di 
linkaggio, per cui non ci sono i riferimenti alla stdlib.H o 
agli header C-like dove sono definite quelle antiche funzioni ?
O magari non ha messo la #include coi prototipi ....
ciao
soviet_mario


No quelli ci sono, anche perchè non mi da errore su atoi ma solo su itoa, ed
è il seguente:
Undefined reference to 'itoa'
collect2: ld returned 1 exit status



Ho provato ad usare sprintf cosi:
for (......)
  {
   FILE *stream;
   stream=fopen("output..txt","a");
   intero=atoi(stringa);
   sprintf(stringaoutput,2,intero);
   fprintf(stream,stringaoutput;
   fflush(stream);
   fclose(strean);
  }
lo compila senza errori ma in esecuzione mi dice segmentation error, google
dice che sto in qualche modo accedendo a qualche memoria per modificarla e
ciò crea un blocco.. dove sbaglio?
Grazie


 meglio.
itoa() non è standard e quindi è lecito che non venga supportata;
atoi() invece sì.
In ogni caso, si può ricorrere alle (standard) sprintf() e strotol()
(che peraltro ha una gestione degli errori migliore di atoi()).

 agli header C-like dove sono definite quelle antiche funzioni ?
La fase di linking non c'entra nulla con gli header.


Ti riposto il codice che ho usato con sprintf che mi da un nuovo errore:
for (......)
  {
   FILE *stream;
   stream=fopen("output..txt","a");
   intero=atoi(stringa);
   sprintf(stringaoutput,2,intero);
   fprintf(stream,stringaoutput;
   fflush(stream);
   fclose(strean);
  }
lo compila senza errori ma in esecuzione mi dice segmentation error, google
dice che sto in qualche modo accedendo a qualche memoria per modificarla e
ciò crea un blocco.. dove sbaglio?
Grazie


 sprintf(stringaoutput,2,intero);
Controlla la sintassi di sprintf().
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic

 binario.. chi mi può dare una mano?
Ma se ti scrivi una funzione Hex2Bin non fai prima? 


Ho fatto nel modo seguente, ma in fase di compilazione mi restituisce molti
warning del tipo:
warning: assignment make integer from pointer without a cast
il codice è questo:
FILE *stream:
char stringa[8];
char stringa_out[32];
stream=fopen("output.txt","a");
sprintf(stringa,num); //num è l'input esadecimale che devo portare in
binario definito precedentemente
for (a=1;a<8;a++)
{
if (stringa[a]="0")
{
   stringa_out[a*4-4]="0";
   stringa_out[a*4-3]="0";
   stringa_out[a*4-2]="0";
   stringa_out[a*4-1]="0";
}
else if (stringa[a]="1")
{
   stringa_out[a*4-4]="0";
   stringa_out[a*4-3]="0";
   stringa_out[a*4-2]="0";
   stringa_out[a*4-1]="1";
}
else if (stringa[a]="2")
{
   stringa_out[a*4-4]="0";
   stringa_out[a*4-3]="0";
   stringa_out[a*4-2]="1";
   stringa_out[a*4-1]="0";
}
ecc ecc 3-4-5-6-7-8-9-10-A-B-C-D-E-F
e infatti nel file output.txt che genera ci sono caratteri strani senza
senso..dove sto sbagliando ora?


 sprintf(stringa,num); //num è l'input esadecimale che devo portare in
uhm, vedo che non hai seguito il saggio consiglio di E.M.G. 
sulla sintassi di sprintf !
Guarda che il secondo parametro di sprintf, come pure 
dell'intera famiglia di funzioni di formattazione, non è il 
primo argomento "opzionale", è un argomento obbligatorio di tipo
const char * fmtText
laddove inserisci i caratteri di controllo per aiutare la 
funzione stessa a interpretare e formattare i parametri 
effettivi, di tipo arbitrario e in numero arbitrario, passati 
SUCCESSIVAMENTE alla funzione.
Quindi come l'hai scritta la funzione compila ma è destinata a 
eseguire in modo imprevedibile e assurdo.
Gli passi un numero (tra l'altro interpretato come indirizzo di 
memoria) invece di una stringa di caratteri di testo "null 
terminated".
Dovevi scrivere qualcosa del tipo, per semplici INTERI decimali
sprintf(stringa, "%d", num)
Ah, poi non is evince dall'esempio, ma è anche importante 
passare un indirizzo valido come primo parametro, il buffer di 
output, che deve essere stato preallocato esternamente a sprintf 
e di dimensioni adatte all'output (cautamente sovradimensionalo, 
un intero di tipo INT in binario potrebbe occupare fino a 33 
byte su una macchina a 32 bit)
Il resto l'ho solo letto di sfuggita, e mi sfugge un po' la 
logica di non avere usato un qualche ciclo di iterazione
ciao
Soviet


 warning: assignment make integer from pointer without a cast
Ma se ti serve in C++ perché usi funzioni del C?
Comunque una semplice funzione potrebbe essere la seguente:
#include <iostream>
#include <string>
// Suppongo che la stringa esadecimane abbia le lettere in maiuscolo (A B C 
D E F per capirci :-D)
std::string Hex2Bin (std::string Hex) {
std::string H2B[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", 
"0111", "1000",
                               "1001", "1010", "1011", "1100", "1101", 
"1110", "1111"};
 std::string Bin = "";
 for (int i = 0; i < Hex.length(); i++)
  if (Hex[i] >= 65)
   Bin += H2B[Hex[i] - 55] + " ";
  else
   Bin += H2B[Hex[i] - 48] + " ";
  return Bin;
};
int main() {
    std::cout << Hex2Bin("B5D") << std::endl; // Stampa 1011 0101 1101
    while (std::cin.get() != '\n');
    return 0;
}
Se non ti è chiaro qualche passaggio fammi sapere .
Ciao 

    sprintf(stringaoutput,2,intero);
Come pretendi che il tuo codice funzioni, se non dai neanche il minimo
sguardo alla sintassi delle funzioni che usi?
Guarda la sintassi di sprintf().
In ogni caso, il tuo problema riguarda più il C che il C++, quindi
imposto il follow-up su it.comp.lang.c.

byte su una macchina a 32 bit)
Ahemm... che vuoi dire?

binario.. chi mi può dare una mano?
#include <iostream>
#include <string>
#include <map>
// solo per l'esempio; da non usare in generale
using namespace std; 
typedef pair<char, string> mapItem_t;
const mapItem_t hex2BinArray[] = {
  mapItem_t('0',"0000"),
  mapItem_t('1',"0001"),
  mapItem_t('2',"0010"),
  mapItem_t('3',"0011"),
  mapItem_t('4',"0100"),
  mapItem_t('5',"0101"),
  mapItem_t('6',"0110"),
  mapItem_t('7',"0111"),
  mapItem_t('8',"1000"),
  mapItem_t('9',"1001"),
  mapItem_t('a',"1010"),
  mapItem_t('b',"1011"),
  mapItem_t('c',"1100"),
  mapItem_t('d',"1101"),              
  mapItem_t('e',"1110"),  
  mapItem_t('f',"1111")
};
int main(int argc, char *argv[])
{
    map<char, string> hex2BinMap(hex2BinArray, hex2BinArray + 16);
 
    string hexString;
    while (getline(cin, hexString)) {
       for (string::size_type i=0; i!=hexString.length(); i++) {
          map<char, string>::iterator it =
                  hex2BinMap.find(hexString[i]);
          if (it != hex2BinMap.end())
            cout << it->second;
          else 
            cout << "????";
       }
       std::cout << std::endl;
    }
    return EXIT_SUCCESS;
}

 meglio.
itoa non e' una funzione della libreria standard; e' un esempio
classico del K&R.
Ciao,
Nicola

Andrea Laforgia ha scritto:

Il dono dell'oscurità pare non mancarmi !
Cmq, volevo dire che oltre ai trentadue caratteri "0" o "1"
(o se preferisci '0' o '1'), ci vuole anche il null finale '\0' 
per terminare la stringa di testo.
In effetti ho detto fino a, ma se uno decide di scrivere 
comunque gli zeri iniziali (cosa che coi numeri ordinari non si 
fa quasi mai), allora l'occupazione di spazio è 33 byte costanti.
ciao
Soviet


Ok ti ringrazio.. perň sto cercando di capire perchč il mio rozzissimo
codice invece non va, vorrei capire cosa c'č che non funziona anche per
imparare, lo posto:
char stringa[8]
char stringa_out[33]
FILE *stream
stream=fopen("output.txt","a");
sprintf(stringa,"%s",hex); //la variabile stringa ottenuta la stampo su file
ed č corretta
for (a=1;a<8;a++)
{
if (stringa[a]='0')
   {
   stringa_out[a*4-4]='0' //scrivo sul primo
   stringa_out[a*4-3]='0' //scrivo sul secondo
   stringa_out[a*4-2]='0' /scrivo sul terzo
   stringa_out[a*4-1]='0' //scrivo sul quarto
   }
if (stringa[a]='1')
   {
   stringa_out[a*4-4]='0'
   stringa_out[a*4-3]='0'
   stringa_out[a*4-2]='0'
   stringa_out[a*4-1]='1'
   }
if (stringa[a]='2')
   {
   stringa_out[a*4-4]='0'
   stringa_out[a*4-3]='0'
   stringa_out[a*4-2]='1'
   stringa_out[a*4-1]='0'
   }
//E via dicendo fino ad F
}
Nel file output.txt ottengo caratteri strani,del tutto sbagliati ma non
capisco perchč..


 capisco perchè..
Vedendo il tuo programma incompleto penso sia impossibile immaginarlo.
Correggi intanto quanto sopra...
  bye
	av.

 imparare, lo posto:
Spostati su it.comp.lang.c