#!/usr/bin/perl
#author : morphad
#date : 2013-12-26
use warnings;
use strict;
use IO::File;
use Fcntl;
sub hexdump
{
my $data = shift;
my $offset = shift;
my @darray = unpack("C*", $data);
my $idx = $offset - $offset % 16;
if ($idx != $offset)
{
printf "%08X | ", $idx;
while ($idx < $offset)
{
printf " " if (($idx % 2) == 0);
printf "--";
$idx++;
}
}
$idx = $offset;
foreach my $byte (@darray)
{
if (($idx % 16) == 0)
{
printf "\n" if ($idx != 0);
printf "%08X | ", $idx;
}
printf " " if (($idx % 2) == 0);
printf "%02X", $byte;
$idx++;
}
printf "\n\n";
}
sub usage
{
print "usage : hexdump.pl file offset len\n";
print "hexdump content of file, len bytes at offset\n";
exit 2;
}
my $file = shift;
my $offset = shift;
my $len = shift;
unless ($file && $offset && $len)
{
usage;
}
my $fh = IO::File->new();
$fh->binmode(":raw");
unless ($fh->open($file, "<")) {
die "cannot open $file";
}
my $buf;
my $readn;
$fh->seek($offset, SEEK_SET);
$readn = $fh->read($buf, $len) || die "cannot read buf";
die "read err" if ($readn != $len);
print "=====hex dump [$file]\n";
hexdump $buf, $offset;
$fh->close();
1;