display length, correctly unpack multi-values (e.g. ip+port)
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 21 Sep 2020 11:37:32 +0000 (13:37 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 21 Sep 2020 11:37:32 +0000 (13:37 +0200)
unpack.pl

index 2b93800..66f4c33 100755 (executable)
--- a/unpack.pl
+++ b/unpack.pl
@@ -82,6 +82,7 @@ while ( $data ) {
        my $pack_fmt = $protocol->{$data_id}->{pack_fmt} || die "can't find pack_fmt for data_id $data_id";
 
        my $data_range;
+       my $data_len;
 
        if ( $data_id == 0x00 ) {
                # sequence number
@@ -98,7 +99,7 @@ while ( $data ) {
        } elsif ( $up_down eq 'up'   && ( $function_code == 0x07 || $function_code == 0x08 || $function_code == 0x03 ) ) {
                # type B
 
-               my $data_len = unpack('C', substr($data,1,1));
+               $data_len = unpack('C', substr($data,1,1));
                $data_range = substr($data,2, $data_len);
 
                $data = substr($data,2 + $data_len);
@@ -106,7 +107,7 @@ while ( $data ) {
        } elsif ( $up_down eq 'down' && $function_code == 0x06 ) {
                # type B
 
-               my $data_len = unpack('C', substr($data,1,1));
+               $data_len = unpack('C', substr($data,1,1));
                $data_range = substr($data,2, $data_len);
 
                $data = substr($data,2 + $data_len);
@@ -123,7 +124,9 @@ while ( $data ) {
                warn "ERROR unknown function_code = $function_code";
        }
 
-       my $v = unpack($pack_fmt, $data_range);
+       my @v = unpack($pack_fmt, $data_range);
+
+       my $v = join(' ', @v);
 
        if ( $data_id == 0x0c ) {
                $v = $v / 100;
@@ -132,7 +135,7 @@ while ( $data ) {
        }
 
        my $description = $protocol->{$data_id}->{description} || die "can't find description for data_id $data_id";
-       print "$up_down | $data_id | $description | v=$v | hex:", unpack('H*', $data_range), " fmt:$pack_fmt | range:",$protocol->{$data_id}->{range}, " | remark:", $protocol->{$data_id}->{remark},"\n";
+       print "$up_down | $data_id 0x",unpack('H*', chr($data_id))," $data_len | $description | v=$v | hex:", unpack('H*', $data_range), " fmt:$pack_fmt | range:",$protocol->{$data_id}->{range}, " | remark:", $protocol->{$data_id}->{remark},"\n";
 }