LZW算法简介

字符串和编码的对应关系是在压缩过程中动态生成的,并且隐含在压缩数据中,解压的时候根据表来进行恢复,算是一种无损压缩.

根据 Lempel-Ziv-Welch Encoding ,简称 LZW 的压缩算法,用任何一种语言来实现它.

LZW压缩算法[1]的基本概念:LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String Table)。在编码时,数据流是输入对象(文本文件的据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流 是输出对象;而编译表是在编码和解码时都须要用借助的对象。字符(Character):最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是 一个像素的颜色在指定的颜色列表中的索引值;字符串(String):由几个连续的字符组成; 前缀(Prefix):也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;根(Root):一个长度的字符串;编码(Code):一 个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目.

LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中 的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态 创建的,解码时还要从已编码的数据中还原出原来的编译表.

原版:

<?php
/**
* @link http://code.google.com/p/php-lzw/
* @author Jakub Vrana, http://php.vrana.cz/
* @copyright 2009 Jakub Vrana
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*//** LZW compression
* @param string data to compress
* @return string binary data
*/
function lzw_compress($string) {// compression$dictionary = array_flip(range("\0", "\xFF"));$word = "";$codes = array();for ($i=0; $i <= strlen($string); $i++) {$x = $string[$i];if (strlen($x) && isset($dictionary[$word . $x])) {$word .= $x;} elseif ($i) {$codes[] = $dictionary[$word];$dictionary[$word . $x] = count($dictionary);$word = $x;}}// convert codes to binary string$dictionary_count = 256;$bits = 8; // ceil(log($dictionary_count, 2))$return = "";$rest = 0;$rest_length = 0;foreach ($codes as $code) {$rest = ($rest << $bits) + $code;$rest_length += $bits;$dictionary_count++;if ($dictionary_count > (1 << $bits)) {$bits++;}while ($rest_length > 7) {$rest_length -= 8;$return .= chr($rest >> $rest_length);$rest &= (1 << $rest_length) - 1;}}return $return . ($rest_length ? chr($rest << (8 - $rest_length)) : "");
}/** LZW decompression
* @param string compressed binary data
* @return string original data
*/
function lzw_decompress($binary) {// convert binary string to codes$dictionary_count = 256;$bits = 8; // ceil(log($dictionary_count, 2))$codes = array();$rest = 0;$rest_length = 0;for ($i=0; $i < strlen($binary); $i++) {$rest = ($rest << 8) + ord($binary[$i]);$rest_length += 8;if ($rest_length >= $bits) {$rest_length -= $bits;$codes[] = $rest >> $rest_length;$rest &= (1 << $rest_length) - 1;$dictionary_count++;if ($dictionary_count > (1 << $bits)) {$bits++;}}}// decompression$dictionary = range("\0", "\xFF");$return = "";foreach ($codes as $i => $code) {$element = $dictionary[$code];if (!isset($element)) {$element = $word . $word[0];}$return .= $element;if ($i) {$dictionary[] = $word . $element[0];}$word = $element;}return $return;
}
$data = "";
$compressed = lzw_compress($data);
var_dump($data === lzw_decompress($compressed));

优化版:

<?php
function lzw_compress($string) {// compression$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;
}/** LZW decompression* @param string compressed binary data* @return string original data*/
function lzw_decompress($binary) {// convert binary string to codes$rest = 0;$rest_length = 0;$out_count = 257;$bits = 9;$bits_max = 512;// decompression$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;// decompression$e = $dict[$rest >> $rest_length];if (!isset($e)) {$e = $w . $w[0];}$return .= $e;$dict[] = $w . $e[0];$w = $e;//--decompression$rest &= (1 << $rest_length) - 1;if (++$out_count > $bits_max) {$bits_max = 1 << ++$bits;}}}return $return;
}?> 

项目:https://code.google.com/p/php-lzw/

LZW算法PHP实现方法 lzw_decompress php相关推荐

  1. LZW算法PHP实现方法 lzw_decompress php

    LZW算法PHP实现方法 lzw_decompress php 博客分类: Php / Pear / Mysql / Node.js LZW算法简介 字符串和编码的对应关系是在压缩过程中动态生成的,并 ...

  2. JS LZW算法压缩与解压

    JS LZW算法压缩与解压,一个JavaScript二进制接口源码,LZW 压缩解压算法,压缩比确实不错,代码不超过200行. <html> <head> <meta h ...

  3. 数据结构与算法--解决问题的方法-顺时针打印矩阵

    顺时针打印矩阵 题目输入一个矩阵,按照从外向里顺时针的顺序依次打印每一个数字.例如下案例: 如上图矩阵,顺时针打印:1,2,3,4,8,12,16,15,14,13,9,5,6,7,1,10 以上问题 ...

  4. 数据结构与算法--解决问题的方法- 二叉树的的镜像

    解决问题的思路 工作中遇到的问题可能用到的数据结构由很多,并且各种数据结构都不简单,我们不可能光凭借想象就能得到问题的解法,因此画图是在家具问题过程中用来帮助自己分析,推理的常用手段.很多问题比较抽象 ...

  5. mergesort_Mergesort算法的功能方法

    mergesort by Joe Chasinga 通过乔·查辛加(Joe Chasinga) Mergesort算法的功能方法 (A functional approach to mergesort ...

  6. 怎么用计算机标准表示方法,算法及其表示方法

    科学技术的进步,社会生产力的发展,都是由于相关的问题得到不断的解决的结果.在当今社会中,由于信息化概念的提出,许多问题的解决都使用到了电子计算机.人们解决问题一般使用到以下两种方法: 1.人工解题 2 ...

  7. 用计算机解题前 需要将解题方法,算法及其表示方法

    科学技术的进步,社会生产力的发展,都是由于相关的问题得到不断的解决的结果.在当今社会中,由于信息化概念的提出,许多问题的解决都使用到了电子计算机.人们解决问题一般使用到以下两种方法: 1.人工解题 2 ...

  8. python模糊神经网络预测_一种基于模糊神经网络的化学分子生物毒性预测模型算法的制作方法...

    本发明属于化工 技术领域: ,具体是一种基于模糊神经网络的化学分子生物毒性预测模型算法. 背景技术: :近些年来,化学物质合成技术飞快发展,合成物质已经应用于社会的各行各业,随着工业的高度发展,全球化 ...

  9. ICDAR2013文本检测算法的衡量方法(二)Rectangle Matching与DetEval

    这是第二部分,第一部分请点击 ICDAR2013文本检测算法的衡量方法(一)Evaluation Levels 主要内容: Rectangle Matching, 或者bbox matching IC ...

最新文章

  1. 树上分治详解 超级详细(附带例题 poj1741(给了题目))
  2. poj 2923(状态压缩dp)
  3. python太慢了-python 读取大文件越来越慢
  4. Android UI(继承控件)--PopupWindow设置动画
  5. java swing鼠标事件监听_java swing鼠标监听问题
  6. Codeforces 994A. Fingerprints
  7. 汇编语言:编写code段中代码,将a段和b段中的数据依次相加,将结果放到c段
  8. 容器编排技术 -- 从零开始k8s
  9. Hadoop分布式系统架构详解
  10. pcsx2 linux双显卡,PC模拟PS2游戏模拟器PCSX2使用教程
  11. js rsa验签_【HAVENT原创】前端使用 jsrsasign 进行 RSA 加密、解密、签名、验签
  12. 在线打开.mpp文件工具备忘录
  13. oracle查看已经创建的同义词,创建同义词synonym
  14. sql修改服务器标记,KB974006-SQL Server 查询优化程序修复程序模型4199服务模型
  15. 2022腾讯实习生移动客户端开发一面(IEG)
  16. SSM框架 基于Bootstrap fileinput 实现文件上传功能
  17. TIP2022/去雾:Variational Single Nighttime Image Haze RemovalWith a Gray Haze-Line Prior具有灰色雾霾线先验的变分去雾
  18. 《历》·陕西帝王陵寝一览
  19. markdown基本用法
  20. springboot2.X整合spring-data-elasticsearch

热门文章

  1. 20 PP配置-生产计划-定义计划订单计划参数
  2. 53 FI配置-财务会计-固定资产-折旧-维护折旧码
  3. java 唯一id生成算法_唯一ID生成算法剖析
  4. python selenium 处理弹窗_python-selenium -- 弹出框处理
  5. C语言单片机等待询问_单片机很好玩8,温度太高就报警,制作一个智能室内温度湿度计...
  6. linux控制器错误码,ubuntu – 不频繁的输入/输出错误 – Linux服务器
  7. 安卓手机卡顿怎么解决_手机卡顿怎么办? 几招教你轻松解决!
  8. linux那些事之中断与异常(AMD64架构)_2
  9. linux ioctl及ioctl command
  10. 17商品推荐系统项目框架