Unix中的字节序问题在十六进制转储中的应用

8
以下*nix命令将IP和端口(127.0.0.1:80)的十六进制表示通过管道输入到hexdump命令中。
printf "\x7F\x00\x00\x01\x00\x50" | hexdump -e '3/1 "%u." /1 "%u:" 1/2 "%u" "\n"'

-e标志允许使用任意格式解析输入。在本例中,我们将IP的前三个八位字节解析为无符号十进制数,后跟一个点。最后一个八位字节也被解析为无符号十进制数,但后面跟着一个冒号。最后 -- 这就是问题所在 -- 端口的2个字节被解析为单个无符号十进制数,后面跟着一个换行符。
根据执行此命令的系统的字节序不同,结果会有所不同。大端系统将正确显示端口80;而小端系统将显示端口20480。
是否有办法在保持通过-e进行任意格式规定的同时,使hexdump能够识别字节序?

我假设如果平台是小端的话,需要通过交换最后两个字节来准备输入是不可接受的,因为你正在问这个问题? - Pascal Cuoq
看起来需要进行字节交换吗? - shrizza
1个回答

6
我不知道是否可以使用hexdump完成,但在perl中很容易实现:
$ printf '\x00\x50' | perl -nE 'say unpack "S>"'
80
$ printf '\x00\x50' | perl -nE 'say unpack "S<"'
20480
您可以调整格式以获得所需的输出。('say'需要perl 5.10及以上版本。对于perl < 5.10,请使用print)
(为了澄清那些因为我没有“回答问题”而想要投反对票的人。我建议OP使用perl替换hexdump。如果您必须投反对票,请自便。)

我想避免使用C/Perl/Python,而是采用更多基于工具的方法。也许可以考虑使用xxd的替代方案? - shrizza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接