Gå til innhold

Hjelp med binær data


Anbefalte innlegg

Videoannonse
Annonse

hvorfor legger du binærdata i en string?

Problemet her er at CString er ikke ment for å lagre binærdata i, og kan skape problemer på grunn av at CString er unicode eller multibyte strings.

Noe som betyr at lengden på en CString er ikke nødvendigvis antall byte i teksten. Dermed kan du miste data ved å lagre binærdata i en string når du skal hente dette tilbake igjen.

 

bruk et char array istedet.

 

edit: for å gjøre det litt mer klart: en unicode bokstav kan ta 1, 2 eller 4 byte.

Endret av GeirGrusom
Lenke til kommentar
ok char array. men har du noen eksempler hvornda man lagrer dataen til harddisk?

 

Ta en titt her, den går igjennom fil io i c, og hvordan du skriver til fil. (Strengt tatt alt du trenger å gjøre er å åpne filen du vil skrive til, og bruke fprintf for dataene og lukke filen)

Endret av Mr.Garibaldi
Lenke til kommentar

jeg har gjort på denne måten men filen som jeg skriver til forblir på 0kb

 

FILE *file = fopen("c:\\test.pdf", "wb");

fprintf(file, pdfBinary);

 

pdfBinary er en CString og den inneholder masse data under debugging.

 

Noe jeg gjør gærnt her?

 

EDIT: Det ser ut som dataen i pdfBinary er herpa. Ligger bare 2k med data der. Må finne ut av dette først.

Endret av evgeny
Lenke til kommentar

FILE* infile = fopen("c:\\binary.file", "rb");
if(infile == NULL){
	std::cerr << "input file not opened" << std::endl;
}
char input[128];
fread(input, 1, 128, infile);
fclose(infile);
FILE* outfile = fopen("output.binary", "wb");
if(outfile == NULL){
	std::cerr << "output file not opened" <<std::endl;
}
fwrite(input, 1, 128, outfile);
fclose(outfile);
char verify[128];
infile = fopen("output.binary", "rb");
fread(verify, 1, 128, infile);
fclose(infile);

for(int i = 0; i < 128; i++){
	if(input[i] != verify[i])
	{
		std::cerr << "feil nr " << i << std::endl;
	}else{
		//warning, this can cause problems....
		std::cerr << input[i] <<std::endl;
	}

}
std::cerr<<"It-works.com :)" <<std::endl;

 

Beklager, jeg kom med en feil anbefaling tidligere, du bør bruke fwrite, ikke fprintf...

Men koden over fungerer helt fint.

Endret av Mr.Garibaldi
Lenke til kommentar
edit: for å gjøre det litt mer klart: en unicode bokstav kan ta 1, 2 eller 4 byte.

Ikke i en CString som er unicode. Der tar hvert tegn akkurat 2 byte (d.v.s. at CString bruker UCS2). Hvis du lagrer unicode som UTF-8 kan hver bokstav ta 1, 2, 3 eller 4 byte. Det finnes mange fler måter å lagre unicode på.

 

Men uansett skal ikke binærdata lagres i en streng. Hvis dataene inneholder 0 blir de kuttet av.

Lenke til kommentar
jeg har gjort på denne måten men filen som jeg skriver til forblir på 0kb

 

FILE *file = fopen("c:\\test.pdf", "wb");

fprintf(file, pdfBinary);

 

pdfBinary er en CString og den inneholder masse data under debugging.

 

Noe jeg gjør gærnt her?

 

Ja, definitivt! Dette er et sikkerhetshull som går under navnet "Format string vulnerability".

Signatur: fprintf(FILE*, format, ...)

Litt avhengig av hva du legger i pdfBinary så kan en gjøre mange morsomme minneoverskrivinger og bedre blir det om dataene i pdfBinary kan manipuleres av angriper.

 

Bruk: fwrite(pdfBinary, [lengden på pdfBinary i bytes], 1, file);

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...