Existe algum utilitário como o hexdump que manipulará a endianidade não-nativa?

6

A habilidade do Hexdump de ler dados binários e formatá-los apropriadamente para que ele possa, por exemplo, ser canalizado para o awk é muito útil, mas eu regularmente preciso ler arquivos nos quais os dados binários são de um endian diferente do nativo para o sistema. Em particular, eu preciso ler dados big-endian em uma pequena máquina endian. Minha solução ideal seria "hexdump" com um switch para reverter o endian-ness, mas tal mudança parece não existir.

Existe alguma solução "próxima melhor" para este problema?

    
por EHN 27.06.2011 / 15:22

5 respostas

3

Is there a utility like hexdump that will handle non-native endian-ness?

Sim, o utilitário é chamado Perl.

Bem, na verdade, Data :: HexDumper - embora você possa faça o seu próprio .

number_format
A string specifying how to format the data. It can be any of the following,
which you will notice have the same meanings as they do to perl's pack function:

C        - unsigned char
S        - unsigned 16-bit, native endianness
v or S<  - unsigned 16-bit, little-endian
n or S>  - unsigned 16-bit, big-endian
L        - unsigned 32-bit, native endianness
V or L<  - unsigned 32-bit, little-endian
N or L>  - unsigned 32-bit, big-endian
Q        - unsigned 64-bit, native endianness
Q<       - unsigned 64-bit, little-endian
Q>       - unsigned 64-bit, big-endian
    
por 27.06.2011 / 17:04
3

Pelo menos para palavras de 16 bits, pode-se passar por dd conv=swab como em

cat file.dat | dd conv=swab | od -t x2
    
por 24.10.2014 / 16:54
1

Como pixelbeat sugere, você pode usar objcopy :

$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin

onde num é 2 para palavras de 16 bits, 4 para palavras de 32 bits e 8 para palavras de 64 bits.

Infelizmente objcopy não tem opção de aceitar entrada de stdin ou escrever saída para stdout , então para usá-lo como um pipe você precisaria escrever um script wrapper que cria arquivos temporários.

Esta resposta é copiada do link e de link .

    
por 07.12.2016 / 12:02
1

Use apenas od (8,23 ou maior). Faz parte do Linux Standard Base, e na minha opinião é melhor que hexdump em tudo. Ele fornece uma opção endian ,

‘--endian=order’
Reorder input bytes, to handle inputs with differing byte orders, or to provide consistent output independent of the endian convention of the current system. Swapping is performed according to the specified --type size and endian order, which can be ‘little’ or ‘big’.

Você pode usá-lo assim,

od --endian big -x

O patch para adicionar isso foi comprometido em 2014

    
por 13.11.2017 / 23:10
0

dd conv = cotonete < file.dat | hexdump

    
por 12.01.2018 / 14:44