您的位置:首页 > 其它

一个压缩算法 可以适当的用来编码

2013-12-07 16:38 176 查看
function encode($string) {
$dict = array_flip(range("\0", "\xFF"));
$dict_size = 256;
$word = $string[0];

$dict_count = 256;
$bits = 8;
$bits_max = 256;
$return = "";
$rest = 0;
$rest_length = 0;

for ($i = 1, $j = strlen($string); $i < $j; $i++) {
$x = $string[$i];
$y = $word . $x;
if (isset($dict[$y])) {
$word .= $x;
} else {
$rest = ($rest << $bits) + $dict[$word];
$rest_length += $bits;
$dict_count++;
if ($dict_count > $bits_max) {
$bits_max = 1 << ++$bits;
}
while ($rest_length > 7) {
$rest_length -= 8;
$return .= chr($rest >> $rest_length);
$rest &= (1 << $rest_length) - 1;
}
$dict[$y] = $dict_size++;
$word = $x;
}
}

$rest = ($rest << $bits) + $dict[$word];
$rest_length += $bits;
$dict_count++;
if ($dict_count > $bits_max) {
$bits_max = 1 << ++$bits;
}
while ($rest_length > 0) {
if($rest_length>7){
$rest_length -= 8;
$return .= chr($rest >> $rest_length);
$rest &= (1 << $rest_length) - 1;
}else{
$return .= chr($rest << (8 - $rest_length));
$rest_length = 0;
}
}

return $return;
}

function decode($binary) {
$rest = 0;
$rest_length = 0;
$out_count = 257;
$bits = 9;
$bits_max = 512;
$dict = range("\0", "\xFF");
$w = $binary[0];
$return = $w;

for ($i = 1, $j = strlen($binary); $i < $j; $i++) {
$rest = ($rest << 8) + ord($binary[$i]);
$rest_length += 8;
if ($rest_length >= $bits) {
$rest_length -= $bits;
$e = $dict[$rest >> $rest_length];
if (!isset($e)) {
$e = $w . $w[0];
}
$return .= $e;
$dict[] = $w . $e[0];
$w = $e;
$rest &= (1 << $rest_length) - 1;
if (++$out_count > $bits_max) {
$bits_max = 1 << ++$bits;
}
}
}

return $return;
}

echo decode(encode(file_get_contents('http://www.baidu.com')));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐