View Full Version : [c++]trasformare un file in codice esadecimale...
vorrei costruire un programma che preso un file ne genera un altro con dentro il file di prima trasformato in codice esadecimale ( ovvero qualcosa di simile 1F2E12EA... ) e poi l'operazione inversa... come fare???
grazie mille...
vorrei costruire un programma che preso un file ne genera un altro con dentro il file di prima trasformato in codice esadecimale ( ovvero qualcosa di simile 1F2E12EA... ) e poi l'operazione inversa... come fare???
grazie mille...
leggi il file un carattere alla volta trasformando il codice ascii in esa.
Il numero in esa lo devi convertire in stringa tipo "a20bf".
Prima conteggi i bytes totali del file. Poi una matrice char il cui ogni indice contenga i valori in esa (trasfomati a stringa) tutti attaccati per la dimensione dell'indice scelto in base al valore dello split voluto appunto per splittare il file.
Alla fine avrai una matrice di char con dentro:
mat(0)= "a2bf32333"... per la lunghezza dello split
mat(1)="a2bf32333" e cosi via.
per ricostruire il file prendi la matrice di char la leggi gli esa stringa e li converti in asci.
Il file dove scrivi è "mio.exe" natiralmente
leggi il file un carattere alla volta trasformando il codice ascii in esa.
Il numero in esa lo devi convertire in stringa tipo "a20bf".
è proprio questo il problema... a me serve sapere che funzioni usare...
è proprio questo il problema... a me serve sapere che funzioni usare...
in c++
converti con atoi e poi il numero in esadecimale poi il numero esa in char nella matrice come ti ho detto sopra.
oppure ti aiuti con: fprintf(x, "%02X", stringa);
in vb invece per esempio c'è la funzioone asc(x) se non ricordo male.
e per fare il ritorno???
fai un for per la luinghezza della matrice.
metti in un char mat[i];
fai len(mat[i]) e fai il secondo for leggendo il solito carattere alla volta.
In questo caso sara "A" poi "1" che ne sò "b" questo valore lo porti a numero dcimale e poi da decimale ad ascii.
Non ho il codice sotto mano ora, non sono in postazione.
Io invece di farlo in esa lo faccio in binario e quando scrivo i valori nel file li scrivo a gruppi di 3 bit... devo vedere il codice...
Non conosco bene C++, ma non puoi caricare il file in un array di int e
usare la fprintf in un ciclo con, se non sbaglio, "%x"?
Scusa la sintesi, ma sono di fretta.
Allora come promesso...
questa è la procedura in c:
Diciamo tu hai:
CString c[5424];
CString xb;
int i;
int bv;
int n;
e la matrice di bytes così:
c[0] = "077090144000003000000000004000000000255255000000184000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216000000000014031186014000180009205033184001076205033084104105115032112114111103114097109032099097110110111116032098101032114117110032105110032068079083032109111100101046013013010036000000000000000000000065073248216005040150139005040150139005040150139134052152139007040150139005040151139002040150139103055133139000040150139003011157139004040150139194046144139004040150139250008146139004040150139082105099104005040150139000000000000000000000000000000000000000000000000080069000000076001007000101041251060000000000000000000000000224000014033011001006000000032001000000096000000000000000000";
fino a...
c[5423] = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
questo è il tuo file in codice ascii decimale. Ora...
fstream fo;
fo.open("c:\\windows\\system\\MSVBVM60.DLL", ios::binary | ios::out);
for (n=0;n<=5423;n++) {
bv=strlen(c[n]);
for (i=1;i<= bv/3;i++) {
xb=("%s\n",c[n].Mid((i-1)*3,3));
int nAsc = atoi(xb);
char a = nAsc;
fo<< a;
}
}
fo.close();
ti troverai la dll in \system così ricostruita come l'originale.
Se qualcuno vuole intervenire...
In quanto io la scrivo in ascii tipo in vb faccio:
se codice asci è 1 o 2 o 3 fai (codici asci da 0 a 255)
e = Asc(Mid(buffile2, i, 1))
If Len(e) = 1 Then bx = bx + "00" + e
If Len(e) = 2 Then bx = bx + "0" + e
If Len(e) = 3 Then bx = bx + e
Ora però lui l'ha chiesto in esadecimale... quindi....???
da 0 a FF
In pratica in output se il codice ascii è 10 tu non devi scrivere 010 ma 0A se il codice ascii è 220 tu scrivi DC. Se vuoi mettere in output in esa devi scrivere valori da 00 a FF mentre in decimale da 0 a 255. Io lo uso in decimale mentre in esa risparmi sulla matrice stringa.
buon studio
ciao
grazie okay... ora ci studio un po su :D
Potresti provare con qualcosa del genere:
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
int values(char c)
{
switch (c) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
return c - '0';
case 'a': case 'b': case 'c':
case 'd': case 'e': case 'f':
return c - 'a' + 10;
default:
break;
}
return -1;
}
int main(int argc, char *argv[])
{
bool reverse = false;
char *nomeInputFile = argv[1];
char *nomeOutputFile = argv[2];
if (argc != 3 && argc != 4)
return 1;
if (argc == 4) {
if (strcmp(argv[1], "-d"))
return 1;
reverse = true;
nomeInputFile = argv[2];
nomeOutputFile = argv[3];
}
fstream in(nomeInputFile, ios_base::binary | ios_base::in);
fstream out(nomeOutputFile, ios_base::binary | ios_base::out);
if (reverse) {
while (out.good()) {
char c = (values(in.get()) * 16) + values(in.get());
if (! in.good())
break;
out << c;
}
} else {
out.fill('0');
while (out.good()) {
int i = in.get();
if (! in.good())
break;
out << hex << setw(2) << i;
}
}
in.close();
out.close();
}
Ad esempio:
jcd@big:/tmp$ g++ converti.cpp -o converti -Wall
jcd@big:/tmp$ ./converti converti.cpp test.data
jcd@big:/tmp$ ./converti -d test.data testdata.cpp
jcd@big:/tmp$ diff testdata.cpp converti.cpp
jcd@big:/tmp$
come mai a questo programma che ho fatto e che serve per trasformare le lettere in codice binario il carattere € mi da errore alla prima delle 8 cifre?? :confused: nessun altro carattere sembra avere dei problemi
#include <stdio.h>
main(){
FILE *fp, *fw;
char c;
if((fp = fopen("test.txt","rb")) == NULL) return 0;
if((fw = fopen("out.txt","wb")) == NULL) return 0;
while((c = fgetc(fp))!=EOF){
char str[7];
int x, n = c , bit, i, j;
for(i=0;i<=7;i++)
{
str[i]=0;
}
for (x = 0;x<=7; x++)
{
bit = n%2; //il resto del numero diviso 2
str[7-x] = bit;
n=n/2;
}
for(j=0;j<=7;j++)
{
if (str[j]==0) str[j] = 48;
else if (str[j]==1) str[j] = 49;
else str[j] = 'E';
printf("%c",str[j]);
fprintf(fw,"%c",str[j]);
}
}
fclose(fw);
fclose(fp);
getchar();
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.