ゆるゆるエンジニアの技術メモ

神奈川在住のITエンジニアの忘備録です。主にプログラミング(Perl, Java など)やネットワーク技術について、学んだことを自分の中で整理するために書いています。書いたことが誰かのご参考になれば幸いです。

ファイルの中身を16進ダンプするスクリプトをちょっとエンハンス

以前、ファイルの中身を16進ダンプで出力するperlスクリプト dumpHexStr.pl を紹介した。
akrad.hatenablog.com

ところが、これではファイル内に改行があった場合にそれが省かれてしまうので、改行も含めて16進ダンプするようにした。

use strict;
use warnings;

my $inFile = $ARGV[0];
if (!-f $inFile) {
    die "There is not $inFile file...";
}
my $outFile = "dumped_" . $inFile;

open(my $inFh,  "< $inFile")  or die("Error :$!");
open(my $outFh, "> $outFile") or die("Error :$!");
binmode($inFh);

while (my $line = <$inFh>) {
    my $hexDump = unpack("H*", $line);
    print($outFh $hexDump)
}

close($inFh);
close($outFh);

使い方は、以前のものと同じ。


なお、

binmode($inFh);

としているのは、ファイルから読み込んだ改行コードをそのまま扱うため。
# Windows上で実機検証したところ、binmode しない状態だと、読み込んだ CRLF(0d0a) が LF(0a) に変換されてしまった。

binmodeしないと、perl は ascii mode で改行を読む込むわけだが、perl は元々UNIX上で動くプログラムなので、UNIXのデフォルトの改行コードである LF(0a) に勝手に変換されるのではないか、と推測している。