Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

272
Vistas
Número mágico en archivos Linux. Programación en C

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"); }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Algunas cosas primero:

  1. 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 .

  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 .

  3. 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/file

Tenga 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'
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda