伟明部落格

使用hexdump以更美化的方式查看二进制文件

--发布于 2024-11-09 18:24:01

我们平时使用hexdump命令以16进制输出二进制文件时,一般是以下这种格式输出的

这种格式不太直观,而且没有对应的ASCII字符的显示。

能不能像下面这种类似日志的格式来查看文件的内容

改造如下:

  1. 增加文件大小的显示
  2. 在输出文件内容之前,输出表格头,方便对照查看文件偏移量
  3. 输出内容分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 <你的文件名或文件路径>

如下所示

代码解析

  1. mhd函数的第2~5行判断mhd 命令至少要用一个参数,作为文件名;
  2. 第7~8行判断文件是否存在;
  3. 第12~15行判断文件是常规的文件,而不是目录或其它管道文件等;
  4. 第17~18行获取文件大小并输出;
  5. 第20~22行判断如果文件是空文件,则直接返回,没必要输出内容;
  6. 第24~26行输出表格头;
  7. 第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字符输出信息会往前缩,如下所示:
  8. 第28行输出表格的底部边框。
--更新于 2024-11-09 18:25:48