Pregunta

Hay un número mágico asociado a cada archivo binario, ¿alguien sabe cómo recuperar esta información del archivo?

¿Fue útil?

Solución

Uso libmagic de la paquete de archivos para tratar de olfatear el tipo de archivo si ese es su objetivo.

No hay números generales "mágicas" en archivos binarios en Unix, aunque diferentes formatos podrían definir su propio. La biblioteca de arriba sabe de muchos de esos y otros también utilizan diversas heurísticas para tratar de averiguar el formato / tipo de archivo.

Otros consejos

file <file_name>

números mágicos se suelen almacenar en (Linux):

/usr/share/file/magic

también comprobar este enlace, alguien estaba tratando de utilizar libmagic para obtener la información en el programa C, podría ser útil si usted está escribiendo algo por sí mismo.

El comando de archivo UNIX utiliza un número mágico. ver el página del manual de archivos por más. (y dónde encontrar el archivo de la magia)

Lea esto: http://linux.die.net/man/5/magic

Es complejo, y depende del tipo de archivo específico que está buscando.

Hay una comando archivo que a su vez utiliza una biblioteca de magia, la magia la biblioteca lee desde un archivo encuentra en / etc llamada magic (esto depende de la instalación y puede variar), que detalla cuáles son los primeros bytes del archivo y le dice al file qué tipo de archivo es, ya sea, jpg, binario , texto, shell script. Existe una versión antigua de libmagic encontrado en sourceforge. Por cierto, hay una respuesta relacionada a este aquí .

Espero que esta ayuda, Atentamente, Tom.

Exponiendo @ respuesta de los números:

Ejemplo a continuación utiliza la base de la magia por defecto para consultar el fichero pasado en la línea de comandos. (Esencialmente una aplicación de la archivo de comandos. Consulte hombre libmagic para más detalles / funciones.

#include <iostream>
#include <magic.h>
#include <cassert>
int main(int argc, char **argv) {
    if (argc == 1) {
            std::cerr << "Usage "  << argv[0] << " [filename]" << std::endl;
            return -1;
    }
    const char * fname = argv[1];
    magic_t cookie = magic_open(0);
    assert (cookie !=nullptr);
    int rc = magic_load(cookie, nullptr);
    assert(rc == 0);
    auto f=  magic_file(cookie, fname);
    if (f ==nullptr) {
        std::cerr << magic_error(cookie) << std::endl;
    } else {
        std::cout << fname << ' ' << f << std::endl;
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top