Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

279
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!