Como obter o número mágico de um arquivo binário
-
23-09-2019 - |
Pergunta
Existe um número mágico associado a cada arquivo binário, alguém sabe como recuperar essas informações do arquivo?
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;
}
}