2009-11-20 6 views
7

La commande * nix suivante représente une représentation hexadécimale d'une adresse IP et d'un port (127.0.0.1:80) dans la commande hexdump.Endianness dans Unix hexdump

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

L'indicateur -e permet un format arbitraire pour analyser l'entrée. Dans ce cas, nous analysons les trois premiers octets de l'adresse IP en décimales non signées suivies d'un point. L'octet final est également analysé en un nombre décimal non signé, mais il est suivi d'un deux-points. Enfin - et c'est là que se situe le problème - les 2 octets du port sont analysés comme une seule décimale non signée suivie d'une nouvelle ligne.

En fonction de l'endianness du système exécutant cette commande, le résultat sera différent. Un système big-endian affichera correctement le port 80; tandis qu'un système little-endian affichera le port 20480.

Existe-t-il un moyen de manipuler hexdump pour être conscient de l'endianness tout en permettant la spécification de format arbitraire via -e?

+0

Je suppose qu'il n'est pas acceptable d'avoir à préparer l'entrée en échangeant les deux derniers octets si la plate-forme est little-endian, puisque vous posez la question? –

+0

Est-ce que cela ressemble à un échange d'octets sera nécessaire? – shrizza

Répondre

6

Je ne sais pas que cela peut être fait avec hexdump, mais il est assez facile en Perl:

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

Vous pouvez modifier que pour obtenir le format que vous désirez. (« Dire » nécessite Perl 5.10. Utilisez Impr pour perl < 5,10)

(Pour clarifier la personne qui souhaite downvote parce que je ne l'ai pas « répondre à la question ». Je suggère que l'OP remplacer hexdump avec perl Downvote si vous devez.)

+0

Je voudrais rester loin de C/Perl/Python et m'en tenir à une approche plus basée sur les outils. Peut-être une alternative xxd? – shrizza