#!/usr/bin/perl
use strict;
use warnings;

my $BUF_LENGTH = 4;
my $ADR_LENGTH = 8;

binmode STDIN;

my $buff;
my $addr = 0;
while (read STDIN, $buff, $BUF_LENGTH) {
    my $len = length $buff;
    my @bytes = unpack "W" x $len, $buff;
    my @b = map { sprintf "%08b", $_ } @bytes;
    my $b = join " ",  @b;
    my $h = join "", map {
            $_ = 0x2e if $_ > 0x7f || $_ < 0x20;
            sprintf "%c", $_
        } @bytes;
    my $bw = $BUF_LENGTH * 9 - 1;
    printf
        "%s  %s  |%s|\n",
        sprintf ("%0${ADR_LENGTH}x", $addr),
        sprintf ("%-${bw}s", $b),
        sprintf ("%-${BUF_LENGTH}s", $h)
    ;
    $addr += $BUF_LENGTH;
}