#!/usr/bin/perl use warnings; use strict; sub makeBitstream { my $lenarr = $#_ + 1; if ($lenarr % 2) { die "Uneven number of elements in array."; } my @l = (); my $i; my $x = 0; while ($x < $lenarr / 2) { push(@l, shift(@_)); $x++; } my @v = @_; my $bitstream = ""; for ($i=0; $i<=$#v; $i++) { my $s = "%0" . $l[$i] ."b"; $bitstream .= sprintf("$s", $v[$i]); } return $bitstream; } sub makeThreeBytes { my $bitstream = shift; my $i; my @listOfBytes = (substr($bitstream, 0, 8), substr($bitstream, 8, 8), substr($bitstream, 16, 8)); for ($i=0; $i<=$#listOfBytes;$i++) { $listOfBytes[$i] = oct("0b". $listOfBytes[$i]); } return @listOfBytes; } my $bitstream = makeBitstream(5, 1, 10, 8, 2, 0, 64, 2); my @listOfBytes = makeThreeBytes($bitstream); my $i; my $checksum = 0; foreach $i (@listOfBytes) { $checksum += $i; } print "$checksum\n"; if ($checksum > 511) { $checksum -= 512; } if ($checksum > 255) { $checksum -= 256; } if ($checksum > 127) { $checksum -= 128; } print "$checksum\n"; my $bits = makeBitstream(5, 1, 10, 8, 8, 2, 0, 64, 2, $checksum); print "$bits\n";