|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
[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... |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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 |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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. Ultima modifica di okay : 23-09-2006 alle 02:20. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
e per fare il ritorno???
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
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... |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
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.
__________________
|Java Base| |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
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 Ultima modifica di okay : 26-09-2006 alle 23:40. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
grazie okay... ora ci studio un po su
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Potresti provare con qualcosa del genere:
Codice:
#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();
}
Codice:
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$ |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
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??
Codice:
#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();
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:58.











|







