Search code examples
perlparsinghexdump

Hex dump parsing in perl


I have a hex dump of a message in a file which i want to get it in an array so i can perform the decoding logic on it.
I was wondering if that was a easier way to parse a message which looks like this.

37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
3B 32 31 36 39 33 34 36 00 00 01 08 40 00 00 15
6C 71 34 34 73 69 6D 31 5F 33 30 33 31 00 00 00
00 00 01 28 40 00 00 15 74 65 6C 63 6F 72 64 69
74 65 6C 63 6F 72 64 69

Note that the data can be max 16 bytes on any row. But any row can contain fewer bytes too (minimum :1 )
Is there a nice and elegant way rather than to read 2 chars at a time in perl ?


Solution

  • Perl has a hex operator that performs the decoding logic for you.

    hex EXPR

    hex

    Interprets EXPR as a hex string and returns the corresponding value. (To convert strings that might start with either 0, 0x, or 0b, see oct.) If EXPR is omitted, uses $_.

    print hex '0xAf'; # prints '175'
    print hex 'aF'; # same
    

    Remember that the default behavior of split chops up a string at whitespace separators, so for example

    $ perl -le '$_ = "a b c"; print for split'
    a
    b
    c

    For every line of the input, separate it into hex values, convert the values to numbers, and push them onto an array for later processing.

    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my @values;
    while (<>) {
      push @values => map hex($_), split;
    }
    
    # for example
    my $sum = 0;
    $sum += $_ for @values;
    print $sum, "\n";
    

    Sample run:

    $ ./sumhex mtanish-input 
    4196