Como criar um despejo hexadecimal de arquivo contendo apenas os caracteres hexadecimais sem espaços no bash?

188

Como crio um dump hexadecimal não modificado de um arquivo binário no Linux usando o bash? Os comandos ode hexdumpinserem espaços no dump e isso não é o ideal.

Existe uma maneira de simplesmente escrever uma seqüência longa com todos os caracteres hexadecimais, menos espaços ou novas linhas na saída?

David Raswik
fonte

Respostas:

250

xxd -p file

Ou se você quiser tudo em uma única linha:

xxd -p file | tr -d '\n'

mark4o
fonte
13
fyi Para inverter o processo: arquivo xxd -r -ps hexascii.txt (é ok com ou sem novas linhas)
Curtis Yallop
92

As strings de formato podem fazer com que o hexdump se comporte exatamente como você deseja (sem espaço em branco, byte a byte):

hexdump -ve '1/1 "%.2x"'

1/1significa "cada formato é aplicado uma vez e ocupa um byte" e "%.2x"é a string de formato real, como em printf. Nesse caso: número hexadecimal de 2 caracteres, zeros à esquerda se for menor.

Michał Trybus
fonte
7
Você precisa de um -vou ele eliminará bytes repetidos e os substituirá por um asterisco.
Pausado até novo aviso.
2
Pergunto-me se a própria hexdump é capaz de acrescentar a nova linha (apenas) para o fim da produção .. (apêndice óbvio ; echotorna impossível usar como apelido bash)
mykhal
2
Meu alias:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
devstuff
A contagem de iteração e byte contagem padrão para um, então 1/1 podem ser omitidos, deixando ohexdump -ve '"%.2x"'
Alex Che
@mykhal, é possível, se você souber o número de bytes na saída. Digamos se você usar o hexdump para gerar apenas 13 primeiros bytes:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che
24

Parece depender dos detalhes da versão do od. No OSX, use este:

od -t x1 -An file |tr -d '\n '

(Isso é impresso como bytes hexadecimais do tipo, sem endereço. E espaço em branco excluído posteriormente, é claro.)

Donal Fellows
fonte
1
Eu também adicionaria -vneste contexto, caso contrário, pula repetições com *.
Ciro Santilli # /
10

One-liner Perl:

perl -e 'local $/; print unpack "H*", <>' file
Alan Haggai Alavi
fonte
Verificado. Corresponde a "arquivo xxd -p | tr -d '\ n'".
Curtis Yallop
1
fyi Para reverter o processo: perl -e 'local $ /; pacote de impressão "H *", arquivo <> '<hexascii.txt>>
Curtis Yallop
O "local $ /" é desnecessário.
Curtis Yallop
Atualizar para o último comentário: O "local $ /" é desnecessário para o "pacote". Para descompactar, você precisa, mas pode colocar "undef $ /" como alternativa. $ / é o separador de linhas (NL padrão). undefined coloca no modo slurp. Portanto, o <> referenciado em um contexto de string puxa o arquivo binário inteiro sem analisá-lo em linhas.
Curtis Yallop 28/05
Formato alternativo: perl -e 'print descompactar "H *", join ("", <>)' <arquivo
Curtis Yallop
2

As outras respostas são preferíveis, mas para uma solução Bash pura, modifiquei o script na minha resposta aqui para poder gerar um fluxo contínuo de caracteres hexadecimais que representam o conteúdo de um arquivo. (O modo normal é emular hexdump -C.)

Pausado até novo aviso.
fonte