sub c2_out { my( $fh, $x, $y )= @_; if( defined $y ) { print $fh pack "C3", $x & 0xff, ($x>>8) | ($y&0xf)<<4, $y>>4; } else { print $fh pack "CC", $x & 0xff, $x>>8; } } sub c2_in { my( $fh )= @_; my $len= read( $fh, $c, 3 ); return if ! $len; die "Extra trailing byte (",unpack("C",$c),")" if 1 == $len; my( $x, $y, $z )= unpack "C*", $c; $x |= ($y&0xf)<<8; return $x if ! defined $z; return( $x, $z<<4 | $y>>4 ); }