fopen und ELF binaries
-
hi,
mal eine kurze frage und zwar verstehe ich nicht, warum das unten angegebene code snippet keine elf files einlesen kann. wenn ich z.b ein textfile einlesen will, steht "len" auf korrekte 90, wenn ich aber nun ein binary einlese steht len immer auf max "7". liegt das an fopen, fread oder...?
... FILE *bin; char *bin_mem; size_t len; bin = fopen(path, "rb"); bin_mem = malloc(90); fread(bin_mem, 1, 90, bin); len = strlen(bin_mem); printf("%d", len); ...
-
Weil man: strlen(3) alle chars zählt bis ein char gleich 0 ist.
-
klar, total vergessen. aber wie kann ich das umgehen, denn fuer z.b fuer textfiles brauch ich die funktion ja. kannst mir ein denkanstosz geben?
-
hat sich grad erledigt, habs so gemacht:
fseek(bin, 0, SEEK_END); b_size = ftell(bin); rewind(bin); len = b_size
danke kingruedi
-
Das ist auch wieder problematisch, da es laut ISO C bei Binären Dateien nicht funktionieren muss
-
hmmmm...
haetteste eine andere idee?
-
Du könntest man: stat(2) unter POSIX benutzen. Obwohl unter POSIX sollte das mit dem man: ftell(3) auch gehen.
-
hmmm, jetzt hab ich dann bei ftell gelassen und frag mich ich nun daher zu solchem ergebnis komme:
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 02 00 03 00 01 00 00 00 50 0e 00 1c 34 00 00 00 |........P...4...| 00000020 ffffff84 ffffffb0 00 00 00 00 00 00 34 00 20 00 09 00 28 00 |.°......4. ...(.| 00000030 16 00 15 00 06 00 00 00 34 00 00 00 34 00 00 1c |........4...4...| 00000040 34 00 00 1c 20 01 00 00 20 01 00 00 05 00 00 00 |4... ... .......| 00000050 04 00 00 00 03 00 00 00 ffffff94 01 00 00 ffffff94 01 00 1c |................| 00000060 ffffff94 01 00 1c 13 00 00 00 13 00 00 00 04 00 00 00 |................| 00000070 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 1c |................| 00000080 00 00 00 1c ffffffa6 73 00 00 ffffffa6 73 00 00 05 00 00 00 |....¦s..¦s......|
... FILE *bin; char *bin_mem; int cell = 16; u_long oset = 0, cind = 0; u_long hpos = 0, apos = 0; size_t len; bin = fopen(path, "rb"); if(bin == NULL) { printf("error: file not found!\n"); } fseek(bin, 0, SEEK_END); b_size = ftell(bin); rewind(bin); bin_mem = malloc(b_size); if(bin_mem == NULL) { printf("error: allocation too big\n"); } fread(bin_mem, 1, b_size, bin); len = b_size; printf("%08x ", oset); while(hpos <= len) { for(cind = 0; cind < cell && hpos <= len; cind++, hpos++) { printf("%02x ", *(bin_mem+hpos)); if(cind == 7) { printf(" "); } } printf(" |"); for(cind = 0; cind < cell && apos <= len; cind++, apos++) { if(isprint(*(bin_mem+apos))) { printf("%c", *(bin_mem+apos)); } else { printf("."); } } printf("|\n"); printf("%08x ", oset+=cell); } free(bin_mem); fclose(bin); printf("\n"); ...
so ein output erhalte ich aber nur bei elf dateien. woran liegt das?
-
hab den fehler gefunden:
musste in dieser zeile noch den wert zu einem unsigned char casten
printf("%02x ",(unsigned char)*(bin_mem+hpos));