2009-11-20 49 views
7

下面的* nix命令将IP和端口(127.0.0.1:80)的十六进制表示转换为hexdump命令。Unix中的字节顺序hexdump

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

-e标志允许任意格式解析输入。在这种情况下,我们将IP的前三个八位字节解析为无符号小数,后面跟着一个点。最后的八位组也被解析成一个无符号的十进制数,但后面跟着一个冒号。最后 - 这就是问题所在 - 端口的2个字节被解析为一个单一的无符号小数,然后是一个换行符。

根据执行此命令的系统的字节顺序,结果会有所不同。大端系统将正确显示端口80;而一个小端系统将显示端口20480.

有什么办法来操纵hexdump来了解endianness,同时仍然允许通过-e任意格式指定吗?

+0

我认为如果平台是小端的,那么必须通过交换最后两个字节来准备输入是不可接受的,因为您问的是这个问题? – 2009-11-20 16:38:32

+0

它看起来像一个字节交换将是必要的? – shrizza 2009-11-20 16:44:53

回答

6

我不知道,它可以与hexdump都可以做,但它是用Perl足够 简单:

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

你可以调整,要得到你想要的格式。 (“说” 需要Perl 5.10。使用打印为Perl < 5.10)

(澄清谁希望downvote因为我没有 “回答这个问题。”我的建议是,OP代替人 hexdump with perl。如果必须,请使用Downvote。)

+0

我想远离C/Perl/Python,只是坚持更基于工具的方法。也许是一个xxd的选择? – shrizza 2009-11-20 17:14:11