PDA

View Full Version : [C++] problema stream esadecimale


grigor91
07-06-2008, 21:08
Il mio problema è questo:
dato uno stream di valori esadecimali di un byte ciascuno che leggo con la funzione fread come faccio ad assegnarli ad un int visto che nello stream non c'è il prefisso "0x"?

71104
08-06-2008, 07:39
ma questi valori esadecimali nello stream sono rappresentati testualmente o numericamente? perché nel secondo caso stai vaneggiando: il computer memorizza solo numeri in base 2 :D

grigor91
08-06-2008, 11:54
testualmente; praticamente derivano dalla conversione da uno stream di valori binari

71104
08-06-2008, 12:06
testualmente; praticamente derivano dalla conversione da uno stream di valori binari dopo il punto e virgola non ho capito niente, comunque devi fare un po' di parsing. dicci meglio il formato; è una roba del genere?
DE AD BE EF

grigor91
08-06-2008, 12:23
lo stream è così:
7F0000EA24FFAE51699AA221.....
praticamente avevo un file binario e con questo algoritmo:



romOrig= fopen(romO,"rb");
romExa= fopen(romEx,"a+b");
romConv=fopen(romC,"a+b");
for(i=0;i<16777217;i++){
c = fgetc(romOrig);
fprintf(romExa, "%02X", (unsigned char)c);
}

ho creato in un altro file sostituendo ad ogni byte del file originario la corrispondente coppia di esadecimali.

adesso devo leggere una coppia alla volta e creare un altro file e sostituire ad ogni coppia di esadecimali un carattere; per esempio se trovo BB al suo posto metto A, se trovo BC metto B e così via.
la mia domanda è se posso assegnare questa coppia di valori ad una variabile intera o se li devo per forza considerare come stringhe

71104
08-06-2008, 13:54
ok, niente spazi tra i bytes quindi. io direi una cosa del genere:

char Bytes[ ... ]; // dichiara la lunghezza che vuoi
istream Source = ... ;

for (unsigned int i = 0; !Source.eof(); i++)
{
char TextByte[3];
Source >> TextByte[0] >> TextByte[1];
TextByte[2] = 0;

istringstream(TextByte) >> hex >> Bytes[i];
}


ma non l'ho testato, potrebbe contenere corbellerie :D

grigor91
08-06-2008, 14:22
ma quali librerie bisogna usare?

wizard1993
08-06-2008, 14:37
a rigor di logica la iostream e la fstream

grigor91
08-06-2008, 14:56
ma istringstream mi dice che è indichiarato

wizard1993
08-06-2008, 15:00
includi la sstream
#include <sstream>
http://www.cplusplus.com/reference/iostream/istringstream/istringstream.html

grigor91
08-06-2008, 15:15
non lo riconosce lo stesso

71104
08-06-2008, 15:32
dopo aver incluso i vari headers delle STL mettici anche un:
using namespace std;

io lo uso sempre e l'ho dato per scontato nel codice che ho scritto perché la naming convention che uso è diversa da quella delle STL e quindi non rischio collisioni con nomi che tra l'altro sono well-known.

grigor91
08-06-2008, 15:34
ma la struct istream come è formata?

71104
08-06-2008, 15:42
ma la struct istream come è formata? non è una struct, è una classe; ed è anche una classe perfettamente standard facente parte delle STL. la trovi documentata qui:
http://www.cplusplus.com/reference/iostream/istream/

grigor91
08-06-2008, 17:19
un'altra domanda:

ma qui cosa bisogna inserire?:

istream Source = ... ;

PS: scusa, ma a scuola siamo rimasti anni luce indietro rispetto alle classi :cry: .

71104
08-06-2008, 17:30
un'altra domanda:

ma qui cosa bisogna inserire?:

istream Source = ... ; dipende da dove proviene questo stream di caratteri esadecimali; se per esempio è contenuto in un file di testo ANSI situato in C:\hex.txt quella dichiarazione va riscritta così:

ifstream Source("C:\\hex.txt");

nota l'uso di ifstream anziché istream; nell'esempio precedente ho usato istream perché non sapendo da dove provengono i tuoi dati mi sono mantenuto sul generico. fosse stata una stringa dovevi usare istringstream.