Quiero obtener el número mágico de un archivo binario (por ejemplo, el archivo ELF hava 7f 45 4c 46). Escribí un programa para imprimir el número mágico del archivo pero aparece el error zsh: error de segmentación ./magic. ¿Cómo debo arreglar esto?
int main() { //setlocale(LC_ALL, "Russian"); //FILE *fp; //fopen (&fp, "/Documents/OCP/lab1test/lab1call", "rb"); FILE *fp; long fSize; fp = fopen("/Documents/OCP/lab1test/lab1call", "rb"); fseek (fp , 0 , SEEK_END); fSize = ftell (fp); rewind (fp); char *magic_number; magic_number=(char *)malloc(fSize+1); //unsigned char magic_number[4]; fread(magic_number, sizeof(char), 4, fp); printf ("A magic number of your file is:\n"); //magic_number[4] = '\0'; //for (int i = 0; i < 4; i++) printf ("%02hhx%02hhx%02hhx%02hhx\n ", magic_number[0],magic_number[1], magic_number[2], magic_number[3]); printf("\n"); }Algunas cosas primero:
Dudo que /Documents/OCP/lab1test/lab1call sea una ruta válida en su sistema. Por lo general, es /home/[USER]/Documents/... , debe verificarlo dos veces. Aún mejor, páselo como argumento a su programa para que pueda hacer fopen(argv[1], ...) después de verificar que argc == 2 .
Definitivamente no necesita buscar todo el camino hasta el final del archivo, y definitivamente no necesita asignar un búfer del tamaño completo del archivo solo para leer cuatro bytes al principio del archivo. Simplemente fread 4 bytes. Puede declarar con seguridad una matriz de 4 bytes en la pila de main .
Debes hacer una comprobación de errores. Casi todas las funciones de biblioteca en C pueden fallar y devolver un error. Consulte la página del manual (generalmente simplemente escriba man 3 function_name en su terminal) y vea qué errores pueden ocurrir para cada función y cuál es un valor de retorno "bueno". La sección 3 del manual es para funciones de biblioteca. Si no tiene el manual instalado, puede usar uno en línea como, por ejemplo , manned.org .
Dicho esto, lo que está tratando de hacer se puede simplificar a:
int main(int argc, char **argv) { FILE *fp; unsigned char magic[4]; if (argc != 2) { fprintf(stderr, "Usage: %s FILENAME\n", argv[0]); return 1; } fp = fopen(argv[1], "rb"); if (fp == NULL) { perror("fopen failed"); return 1; } if (fread(magic, 1, 4, fp) != 4) { if (feof(fp)) fputs("File is less than 4 bytes\n", stderr); else fputs("Error reading the file\n", stderr); return 1; } fclose(fp); puts("The magic number of your file is:"); printf("%02hhx%02hhx%02hhx%02hhx\n", magic[0], magic[1], magic[2], magic[3]); return 0; }Puede compilar y luego ejecutar su programa de esta manera:
./magic path/to/the/fileTenga en cuenta que si la ruta contiene espacios, deberá encerrarlo entre comillas; de lo contrario, se interpretará como dos argumentos diferentes:
./magic 'path/with some/spaces'