使用hexdump以更美化的方式查看二进制文件
--发布于 2024-11-09 18:24:01
我们平时使用hexdump
命令以16进制输出二进制文件时,一般是以下这种格式输出的
这种格式不太直观,而且没有对应的ASCII字符的显示。
能不能像下面这种类似日志的格式来查看文件的内容
改造如下:
- 增加文件大小的显示
- 在输出文件内容之前,输出表格头,方便对照查看文件偏移量
- 输出内容分3栏显示:左边为偏移量(以10进制方式,也可以改为16进制方式);中间为以16进制方式显示每个字节的内容;右边以ASCII字符的方式输出每个内容(如果是不可打印字节),输出一个点号。
为了实现这个需求,写了下面这个Bash Shell函数,叫做mhd
。字母m代表my,字母h代表hex,字母d代表dump。
function mhd() {
if [ $# -lt 1 ]; then
echo 'Usage: myhd <filepath>';
return 1;
fi
if ! [ -e $1 ]; then
echo "Error!File does not exist.";
return 1;
fi
if ! [ -f $1 ]; then
echo "Error!It's not a regular file.";
return 1;
fi
fileSize=$(stat --format="%s" $1);
echo -e "File size: $fileSize Byte(s)";
if [ $fileSize -eq 0 ]; then
return 0;
fi
echo -e "-------------------------------------------------------------------------------";
echo -e "| OFFSET | 0 1 2 3 4 5 6 7 8 9 A B C D E F | 0123456789ABCDEF |";
echo -e "-------------------------------------------------------------------------------";
hexdump -e '"| %06_ad | " 16/1 "%02X "' -e '" | " 16/1 "%1_p" " |\n"' $1;
echo -e "-------------------------------------------------------------------------------";
}
将上面这段代码添加到Shell初始化脚本(如用户HOME目录的 .bashrc
文件)中,然后重新Shell,使用脚本生效,就可以使用mhd
命令了。使用方式
mdh <你的文件名或文件路径>
如下所示
代码解析
- mhd函数的第2~5行判断mhd 命令至少要用一个参数,作为文件名;
- 第7~8行判断文件是否存在;
- 第12~15行判断文件是常规的文件,而不是目录或其它管道文件等;
- 第17~18行获取文件大小并输出;
- 第20~22行判断如果文件是空文件,则直接返回,没必要输出内容;
- 第24~26行输出表格头;
- 第27行的
hexdump
命令的-e
选项指定了自定义的输出格式:%06_ad
用于输出偏移地址信息,%06
表示输出6位数字,不足部分前面补0,_a
表示输出的是偏移地址,d
表示以10进制格式显示(如果想以16进制方式显示偏移地址,可以使用字母x
);%02X
用于输出中间栏的内容,以16进制方式输出2位数字,不足部分前面补0;%1_p
中的_p
表示以ASCII字符方式输出每个字节的内容,不可打印字符以点号表示,百分号%
后面的数字1表示以定长1个字符宽度的方式输出这个内容,如果省略了这个1,即%_p
,则对于大小不是16整数倍的文件而言,那段ASCII字符输出信息会往前缩,如下所示: - 第28行输出表格的底部边框。
--更新于 2024-11-09 18:25:48