C:\Users\Bill\forums\monks>type ozboomer.pl use strict; use warnings; my @data = ( 0x2E, 0x75, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x10, 0x57, 0x56, 0x32, 0x20, 0x20, 0x20, 0x80, 0x49, 0x3D, 0x34, 0x32, 0x37, 0x20, 0x4C, 0x61, 0x6D, 0x70, 0x20, 0x64, 0x69, 0x6D, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3D, 0x32, 0x20, 0x5B, 0x53, 0x43, 0x41, 0x54, 0x53, 0x3D, 0x30, 0x5D, 0x2E ); my @formats = ( "C8a6C33C1", "C8A6(A)33C1" ); my $inbuf = join('', map { chr($_) } @data); # Input buffer printf("\$inbuf: >%s<\n", $inbuf); printf("\n"); foreach my $fmt (@formats) { my $tmpbuf = $inbuf; # In case something's being corrupted my ($event_len, $tail_len); my ($year, $mon, $day); my ($hour, $min, $sec); my $rec_type_idx; my $source_name; my @data; ($event_len, $year, $mon, $day, $hour, $min, $sec, $rec_type_idx, $source_name, @data[0..32], $tail_len) = unpack($fmt, $tmp buf); my $date_str = sprintf("%s/%s/%s", $day, $mon, $year+1900); my $time_str = sprintf("%02d:%02d:%02d", $hour, $min, $sec); $rec_type_idx &= 0x1F; # Only use b0-b6 printf(" Format: %s\n", $fmt); printf(" \$event_len: %02Xx = %d\n", $event_len, $event_len); printf(" \$date_str: %s\n", $date_str); printf(" \$time_str: %s\n", $time_str); printf("\$rec_type_idx: %02Xx = %d\n", $rec_type_idx, $rec_type_idx); printf(" \$source_name: !%s!\n", $source_name); printf(" \$data: !%s!\n", join(' ', @data)); printf(" \$tail_len: %02Xx = %d\n", $tail_len, $tail_len); printf("\n"); } C:\Users\Bill\forums\monks>perl ozboomer.pl $inbuf: >.u ♦ ►WV2 ÇI=427 Lamp dim state=2 [SCATS=0].< Format: C8a6C33C1 $event_len: 2Ex = 46 $date_str: 4/10/2017 $time_str: 00:00:00 $rec_type_idx: 10x = 16 $source_name: !WV2 ! $data: !128 73 61 52 50 55 32 76 97 109 112 32 100 105 109 32 115 116 97 116 101 61 50 32 91 83 67 65 84 83 61 48 93! $tail_len: 2Ex = 46 Format: C8A6(A)33C1 $event_len: 2Ex = 46 $date_str: 4/10/2017 $time_str: 00:00:00 $rec_type_idx: 10x = 16 $source_name: !WV2! $data: !Ç I = 4 2 7 L a m p d i m s t a t e = 2 [ S C A T S = 0 ]! $tail_len: 2Ex = 46