2009-11-20 13 views
7

El siguiente comando * nix canaliza una representación hexadecimal de un IP y puerto (127.0.0.1:80) en el comando hexdump.Endianness en Unix hexdump

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

El distintivo -e permite un formato arbitrario para analizar la entrada. En este caso, estamos analizando los primeros tres octetos del IP en decimales sin signo seguidos de un punto. El octeto final también se analiza en un decimal sin signo, pero va seguido de dos puntos. Finalmente, y aquí es donde reside el problema, los 2 bytes para el puerto se analizan como un único decimal sin signo seguido de una nueva línea.

Dependiendo de la endianidad del sistema que ejecuta este comando, el resultado será diferente. Un sistema big-endian mostrará correctamente el puerto 80; mientras que un sistema little-endian mostrará el puerto 20480.

¿Hay alguna forma de manipular hexdump para estar al tanto de la endianancia y al mismo tiempo permitir la especificación de formato arbitrario a través de -e?

+0

Supongo que no es aceptable tener que preparar la entrada intercambiando los dos últimos bytes si la plataforma es little-endian, ya que está haciendo la pregunta? –

+0

¿Parece que un byte-swap será necesario? – shrizza

Respuesta

6

No sé que se puede hacer con hexdump, pero es lo suficientemente fácil en Perl:

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

Se pueden ajustar para conseguir que el formato que desee. ('Dicen' requiere Perl 5.10. Utilice impresión para Perl < 5,10)

(Para aclarar para la persona que desee downvote porque lo hice no "responder a la pregunta". Estoy sugiriendo que el PO reemplazar hexdump con perl. Votar menos si es necesario)

+0

Me gustaría mantenerme alejado de C/Perl/Python y solo apegarme a un enfoque más basado en herramientas. Quizás una alternativa xxd? – shrizza