Pergunta

Existe um número mágico associado a cada arquivo binário, alguém sabe como recuperar essas informações do arquivo?

Foi útil?

Solução

Usar libmagic de Arquivo Pacote para tentar farejar o tipo de arquivo, se esse for o seu objetivo.

Não existem números gerais de "mágica" em arquivos binários no Unix, embora diferentes formatos possam definir seus próprios. A biblioteca acima conhece muitos deles e também usa várias outras heurísticas para tentar descobrir o formato/tipo de arquivo.

Outras dicas

file <file_name>

Os números mágicos geralmente são armazenados em (Linux):

/usr/share/file/magic

Verifique também este link, alguém estava tentando usar o LBMagic para obter as informações no programa C, pode ser útil se você estiver escrevendo algo sozinho.

O comando do arquivo unix usa o número mágico. Veja o Página do manual do arquivo para mais. (e onde encontrar o arquivo mágico)

Leia isso: http://linux.die.net/man/5/magic

É complexo e depende do tipo de arquivo específico que você está procurando.

Existe um Arquivo Comando que, por sua vez magic (Isso depende da instalação e pode variar), que detalha quais são os primeiros bytes do arquivo e diz ao file Que tipo de arquivo é, seja, jpg, binário, texto, script de shell. Há uma versão antiga do libmagic encontrada no SourceForge. Aliás, há uma resposta relacionada a isso aqui.

Espero que isso ajude, cumprimentos, Tom.

Expondo a resposta do @nos:

O exemplo abaixo usa o banco de dados mágico padrão para consultar o arquivo passado na linha de comando. (Essencialmente uma implementação do Arquivo comando. Ver homem libmagic Para mais detalhes/funções.

#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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top