Esiste un'utilità come hexdump che gestirà l'endianità non nativa?


6

La capacità di Hexdump di leggere i dati binari e formattarli in modo appropriato in modo che, ad esempio, possa essere reindirizzato a awk è molto utile, ma ho regolarmente bisogno di leggere file in cui i dati binari sono di una endianità diversa da quella nativa del sistema . In particolare, ho bisogno di leggere i dati big-endian su una piccola macchina endian. La mia soluzione ideale sarebbe "hexdump" con un interruttore per invertire l'endianità, ma tale interruttore non sembra esistere.

Esistono buone soluzioni "next-best" a questo problema?


questo probabilmente non è in tema di superutente e dovrebbe essere invece su Unix e Linux, per favore, rivedi la mia risposta per un metodo migliore di quello scelto.
Evan Carroll,

Risposte:


3

Esiste un'utilità come hexdump che gestirà l'endianità non nativa?

Sì, l'utilità si chiama Perl.

Bene, in realtà Data :: HexDumper - anche se potresti farlo tu stesso .

number_format
Una stringa che specifica come formattare i dati. Può essere uno dei seguenti,
che noterai avere gli stessi significati che hanno per la funzione pack di perl:

C - carattere non firmato
S: endianness nativo senza segno a 16 bit
v o S <- senza segno a 16 bit, little-endian
n o S> - senza segno a 16 bit, big-endian
L - endianness nativo a 32 bit senza segno
V o L <- senza segno a 32 bit, little-endian
N o L> - senza segno a 32 bit, big-endian
Q - endianness nativo a 64 bit senza segno
Q <- unsigned 64-bit, little-endian
Q> - 64-bit senza segno, big-endian

Non sono davvero contento di fare affidamento su perl e di dover fare la tipizzazione extra (certamente molto limitata) rispetto a hexdump, ma sono diventato convinto che non esistano opzioni migliori.
EHN,

4

Almeno per le parole a 16 bit si può passare attraverso dd conv=swabcome in,

cat file.dat | dd conv=swab | od -t x2

1

Come suggerisce pixelbeat , potresti usare objcopy :

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

dove numè 2 per le parole a 16 bit, 4 per le parole a 32 bit e 8 per le parole a 64 bit.

Purtroppo objcopy non ha alcuna opzione per accettare input stdino scrivere output stdout, quindi per usarlo come pipe dovresti scrivere uno script wrapper che crea file temporanei.

Questa risposta viene copiata da https://stackoverflow.com/a/19288235/1979048 e da https://serverfault.com/a/329207/157443 .


1

Basta usare od(8.23 o successivo). Fa parte della Linux Standard Base, e secondo me è meglio che hexdumpin tutto. Fornisce endianun'opzione,

‘--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’.

Puoi usarlo in questo modo,

od --endian big -x

La patch per aggiungere questo è stata impegnata nel 2014


1
od non ha un'opzione --endian su nessuno dei sistemi che uso (GNU coreutils 8.22 o OS X 10.11.6)
EHN

1
@EHN È stato commesso in 8.23 ​​che era nel 2014. Domanda aggiornata per riflettere ciò.
Evan Carroll,

0

dd conv = swab <file.dat | hexdump


3
Benvenuti nel sito. Potresti arricchire questa risposta con una spiegazione di ciò che fa questo comando e qualche dettaglio in più?
Darren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.