my $server_root_dispersion_binary = substr($received_data, 64, 32); my $server_root_dispersion = oct("0b".$server_root_dispersion_binary); #### my $server_root_dispersion = oct("0b" . substr($received_data, 64, 32)); #### my $server_precision = oct("0b" . substr($received_data, 24, 8)); my $server_root_delay = oct("0b" . substr($received_data, 32, 32)); #### my $server_precision = oct("0b" . substr($received_data, 24, 8)); my $server_root_delay = oct("0b" . substr($received_data, 24+8, 32)); #### my $server_precision = oct("0b" . substr($received_data, $here, ($width = 8))); $here += $width; my $server_root_delay = oct("0b" . substr($received_data, $here, ($width = 32))); $here += $width; #### if ($received_data) { my $here = 0; my $next_value = sub { my $width = shift; my $start = $here; $here += $width; return oct("0b".substr($received_data, $start, $width)); }; my $server_li = $next_value->(2); my $server_vn = $next_value->(3); my $server_mode = $next_value->(3); my $server_stratum = $next_value->(8); ... #### if ($received_data) { my $here = 0; my ($server_li, $server_vn, $server_mode, $server_stratum, ... ) = map { my $start = $here; $here += $_; return oct("0b".substr($received_data, $start, $_)); } (2, 3, 3, 8, ... ) #### my ($server_li, $server_vn, $server_mode, $server_stratum, ... ) map { oct("0b".$_) } unpack 'a2a3a3a8...', $received_data #### our (@fields, %width, $packt); { my @f = ( # list of field names and widths in the order in which they appear li => 2, vn => 3, mode => 3, (map {$_ => 8} qw(stratum poll_interval precision)), (map {$_ => 32} qw(root_delay dispersion identifier)), (map {$_ => 64} qw(ref_epoch originate_epoch receive_epoch transmit_epoch)) ); @fields = map {$f[$_*2]} (0 .. @f/2); %width = (@f); $packt = join '', map {"a$width{$_}"} @fields; } ... %srv = (); @srv{@fields} = map { oct("0b".$_) } unpack $packt, $received_data;