2009-11-20 9 views
7

Il seguente comando * nix convoglia una rappresentazione esadecimale di un IP e di una porta (127.0.0.1:80) nel comando hexdump.Endianness in Unix hexdump

printf "\x7F\x00\x00\x01\x00\x50" | hexdump -e '3/1 "%u." /1 "%u:" 1/2 "%u" "\n"' 

Il flag -e consente a un formato arbitrario di analizzare l'input. In questo caso, stiamo analizzando i primi tre ottetti dell'IP in decimali non firmati seguiti da un punto. L'ottetto finale viene anche analizzato in un decimale senza segno, ma è seguito da due punti. Infine - ed è qui che si trova il problema - i 2 byte per la porta vengono analizzati come un singolo decimale senza segno seguito da una nuova riga.

A seconda della endianità del sistema che esegue questo comando, il risultato sarà diverso. Un sistema big-endian mostrerà correttamente la porta 80; mentre un sistema little-endian mostrerà la porta 20480.

C'è un modo per manipolare hexdump per essere a conoscenza di endianness pur consentendo la specifica del formato arbitrario via -e?

+0

Suppongo che non sia accettabile dover preparare l'input scambiando gli ultimi due byte se la piattaforma è little-endian, dal momento che stai ponendo la domanda? –

+0

Sembra che sia necessario uno scambio di byte? – shrizza

risposta

6

Non so che può essere fatto con hexdump, ma è abbastanza facile in Perl:

 
$ printf '\x00\x50' | perl -nE 'say unpack "S>"' 
80 
$ printf '\x00\x50' | perl -nE 'say unpack "S<"' 
20480 

è possibile modificare che per ottenere il formato desiderato. ('Dicono' richiede perl 5.10. Usare stampa per perl < 5,10)

(Per chiarire per la persona che desidera downvote perché non ho "rispondere alla domanda". Sto suggerendo che il PO sostituire hexdump con perl.Valocemente se necessario)

+0

Mi piacerebbe stare lontano da C/Perl/Python e limitarmi a un approccio più basato sugli strumenti. Forse un'alternativa xxd? – shrizza