技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

ファイルの中身を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) に勝手に変換されるのではないか、と推測している。