|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
[C] conversione da testo ad ascii-hex-oct-bin
ciao raga! avrei bisogno di un parere: voglio fare un programma che prenda in input un file di testo (codificato in ascii), e che generi come output, sempre in un file di testo, la corrispondente versione con i caratteri o in valore ascii, o in esadecimale, o in ottale, o in binario. (poi i caratteri a loro volta saranno ascii nel file di testo, ma questa è un'altra storia.. senò mi basterebbe aprire il file di testo con un hexeditor..).
in linea di massima so come fare il programma, solo volevo un vostro parere su come agire per le conversioni: mi carico in memoria tutta la tabella delle varie conversioni ( pensavo di fare una struttura per ogni voce, contenente carattere ascii, numero del carattere in ascii, corrispondente esadecimale, ottale e binario, e poi creerei un vettore di 255 elementi di questa struttura), oppure cerco di ricavarmi per ogni carattere trovato nel file di testo la relativa conversione? oppure non so datemi voi un consiglio.. vorrei fare un programma che sia abbastanza efficiente! grazie a tutti in anticipo! ![]()
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
63 69 61 6F oppure 143 151 141 157 oppure 01100011 01101001 ........ Giusto? Innanzitutto non devi creare alcuna tabella! Basta semplicemente che usi le funzioni della famiglia printf per formattare un valore. Codice:
char car = 'a'; printf ("%d\n", car & 0xFF); // decimale printf ("%x\n", car & 0xFF); // esadecimale printf ("%o\n", car & 0xFF); // ottale
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | ||
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
Quote:
Quote:
scusa non è che mi potresti spiegare anche questo ? io per il binario sincermente pensavo prima di scrivere il valore il esadecimale e poi fare la corrispondenza 0 = 0000, ... F = 1111. però a quanto ho capito con il tuo metodo sarebbe più veloce ed elegante.. ma come? più che altro non so come analizzare ogni bit del carattere.. prendo il codice ascii del carattere e lo scrivo in binario?
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
||
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quando passi alla printf un char, esso viene convertito in int e quindi viene esteso il segno. Se il carattere fosse un carattere speciale es. una 'è' avrebbe il bit 7 a 1, quindi facendo ad esempio: char car = 'è'; printf ("%d\n", car); /* stampa -24 */ printf ("%x\n", car); /* stampa ffffffe8 */ Che molto probabilmente non è quello che ci si aspetta. Facendo la and con 0xFF si fa in modo che il valore intero passato sia tra 0 e 255. Se non si vuole fare una and, si può usare il tipo di dato unsigned char. Quote:
Codice:
void print_bin_char (char c) { int m; for (m = 128; m != 0; m >>= 1) printf (c & m ? "1" : "0"); }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#5 | ||
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
Quote:
Quote:
cmq grazie mille per la tua gentilezza! lo so ogni tanto scasso.. è che non è da molto che programma ed a parte i programmini classici non so fare molto altro così sto imparando.. giusto per sapere, se volessi fare l'operazione contraria (da binario,hex, oct, ascii a testo) sarebbe un casino?
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
||
![]() |
![]() |
![]() |
#6 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Motivo per cui otterrò 64, 32, 16 ..... fino a quando diventa zero perché il bit "esce" dal valore. Quote:
expr1 ? expr2 : expr3 Innanzitutto valuta expr1 e se è "vero" valuta solo expr2, altrimenti valuta solo expr3. È un modo molto comodo per "accorciare" un if, perché altrimenti avrei dovuto fare: Codice:
if (c & m) printf ("1"); else printf ("0"); Quote:
Per fare una conversione affidabile, si dovrebbe controllare ogni singolo carattere e magari indicare in uscita se la conversione è ok oppure no. Faccio l'esempio di conversione da stringa (che contiene una sequenza binaria) a char: Codice:
int binstr_to_char (char *str, char *pvalue) { char c, value = 0; while ((c = *str++) != '\0') { if (c != '0' && c != '1') return 0; /* Errore, carattere non valido */ if (value & 128) return 0; /* Errore, overflow */ value = value << 1 | (c == '1'); } *pvalue = value; return 1; /* Successo */ } Con il binario è abbastanza semplice, basta oltretutto fare uno shift. Con altre basi c'è da fare un po' più di attenzione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 23-02-2007 alle 09:49. |
|||
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Oct 2005
Messaggi: 290
|
ok grazie mille per tutte le informazioni! sei stato gentilissimo
![]() ora mi metto al lavoro.. (anche se ho da fare ben poco visto che le parti principali me le hai scritte tu ![]() poi ti faccio sapere quando l'ho fatto tutto! (o se avrò altri casini..) grazie 1000 ancora! ciao! ![]()
__________________
_______________________________________________ AMD Athlon64 3500+, Cooler Master Hyper 6, Asus A8V Deluxe wifi-g Rev2.0, Corsair TwinX-1024 Pc3200XL Platinum, Western Digital Raptor 74GB, Cooler Master CoolDrive 4, Sapphire Radeon 9600XT 256MB, Sound Blaster Audigy Player, Cambridge Soundworks 4.0, Enermax Coolergiant EG485p/ax, Lg Flatron L1952S --- Acer Aspire 5024 ![]() Apple MacBook Pro 13" 2.53GHz ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:39.