public static function huffman_encode($input)
{
$codes = self::$huffman_codes;
$lens = self::$huffman_lens;
$len = \strlen($input);
$out = \str_repeat("", $len * 5 + 1);
// max length
for ($bitcount = $i = 0; $i < $len; $i++) {
$chr = $input[$i];
$byte = $bitcount >> 3;
foreach ($codes[$bitcount % 8][$chr] as $bits) {
$out[$byte] = $out[$byte] | $bits;
$byte++;
}
$bitcount += $lens[$chr];
}
$bytes = $bitcount / 8;
$e = (int) \ceil($bytes);
if ($e != $bytes) {
$out[$e - 1] = $out[$e - 1] | \chr(0xff >> $bitcount % 8);
}
return \substr($out, 0, $e);
}