LZSS压缩算法实验报告

合集下载

实验二材料力学压缩实验报告

实验二材料力学压缩实验报告

金属材料压缩实验一、实验目的1.测定低碳钢压缩时的下屈服强度R eL(或屈服极限σs);2.测定铸铁压缩时的抗压强度R m(或抗压强度极限σb);3.观察并比较低碳钢和铸铁在压缩时的缩短变形和破坏现象。

二、预习思考要点1.用短圆柱状低碳钢和铸铁试样做压缩实验时,怎样才能做到使其轴向(心)受压?放置压缩试样的支承垫板底部为什么制作成球形?2.圆柱状低碳钢试样被压缩成饼状而不破碎,而圆柱状铸铁试样被压破裂面常发生在与轴线大致成45°~55°方向上,二者的变形特征与破坏形式为什么不同?三、实验仪器和设备1.万能材料试验机;2.游标卡尺。

四、实验试样对于低碳钢和铸铁类金属材料,按照GB 7314—1987《金属压缩试验方法》的规定,金属材料的压缩试样多采用圆柱体如图1-9所示。

试样的长度L一般为直径d的2.5~3.5倍,其直径d = 10mm~20mm。

也可采用正方形柱体试样如图1-10所示。

要求试样端面应尽量光滑,以减小摩阻力对横向变形的影响。

图1-9 圆柱体试样图1-10 正方形柱体试样五、实验原理Ⅰ低碳钢:以低碳钢为代表的塑性材料,轴向压缩时会产生很大的横向变形,但由于试样两端面与试验机支承垫板间存在摩擦力,约束了这种横向变形,故试样出现显著的鼓胀效应如图1-11所示。

为了减小鼓胀效应的影响,通常的做法是除了将试样端面制作得光滑以外,还可在端面涂上润滑剂以利最大限度地减小摩擦力。

低碳钢试样的压缩曲线如图1-12所示,由于试样越压越扁,则横截面面积不断增大,试样抗压能力也随之提高,故曲线是持续上升为很陡的曲线。

从压缩曲线上可看出,塑性材料受压时在弹性阶段的比例极限、弹性模量和屈服阶段的屈服点(下屈服强度)同拉伸时是相同的。

但压缩试验过程中到达屈服阶段时不像拉伸试验时那样明显,因此要认真仔细观察才能确定屈服荷载F eL,从而得到压缩时的屈服点强度(或下屈服强度)R eL= F eL/S0。

压缩实验报告数据分析

压缩实验报告数据分析

一、实验背景压缩实验是一种常见的力学实验,通过在特定的实验条件下对材料进行压缩,研究其力学性能。

本次实验主要针对某一种材料进行压缩实验,以了解其压缩性能。

本报告将对实验数据进行详细分析,得出实验结果。

二、实验目的1. 研究材料在不同压力下的变形情况;2. 了解材料的弹性模量和屈服强度;3. 分析材料在不同压力下的力学性能。

三、实验原理压缩实验通常采用单轴压缩实验,即在轴向施加压力,使材料发生压缩变形。

根据胡克定律,材料的应力与应变之间存在线性关系,即应力=弹性模量×应变。

当材料达到屈服强度时,应力与应变之间的关系将不再线性,此时材料将发生塑性变形。

四、实验方法1. 实验材料:选取某一种材料作为实验对象;2. 实验设备:压缩试验机;3. 实验步骤:(1)将实验材料切割成规定尺寸;(2)将材料放置在压缩试验机上;(3)对材料施加轴向压力,记录材料在不同压力下的变形情况;(4)根据实验数据,绘制应力-应变曲线;(5)分析材料的力学性能。

五、实验数据及分析1. 实验数据表1:实验数据压力(MPa)应变(%)应力(MPa)0 0 010 0.5 2020 1.0 4030 1.5 6040 2.0 8050 2.5 1002. 数据分析(1)线性阶段:从表1中可以看出,在压力0-30MPa范围内,材料的应力与应变呈线性关系,弹性模量E=40MPa。

这说明材料在该压力范围内具有良好的弹性性能。

(2)非线性阶段:当压力超过30MPa时,应力与应变之间的关系不再线性,材料开始发生塑性变形。

此时,材料的屈服强度约为100MPa。

(3)应力-应变曲线:根据实验数据,绘制应力-应变曲线,如图1所示。

曲线在压力0-30MPa范围内呈线性,压力超过30MPa后,曲线出现拐点,表明材料开始发生塑性变形。

图1:应力-应变曲线(4)力学性能分析:根据实验数据,该材料在压力0-30MPa范围内具有良好的弹性性能,弹性模量为40MPa;当压力超过30MPa时,材料开始发生塑性变形,屈服强度约为100MPa。

lzss压缩标准

lzss压缩标准

lzss压缩标准LZSS压缩标准是一种常见的无损压缩算法,广泛应用于数据压缩和存储领域。

它由Lempel和Ziv于1977年首次提出,并在此后得到不断改进和优化。

本文将介绍LZSS压缩标准的基本原理、算法实现以及应用领域。

一、基本原理LZSS压缩标准基于滑动窗口的概念,将待压缩的数据分为两部分:查找缓冲区(Lookahead Buffer)和搜索缓冲区(Search Buffer)。

其中,查找缓冲区用于存储已经压缩的数据,搜索缓冲区用于匹配和压缩新的数据。

LZSS压缩标准的基本思想是尽可能利用已经压缩的数据来替代重复出现的新数据。

具体过程如下:从搜索缓冲区中找到与查找缓冲区中的数据最长匹配的字符串,将该字符串的位置和长度作为压缩码输出。

如果没有找到匹配的字符串,则直接将当前字符输出。

二、算法实现LZSS压缩标准的算法实现相对简单,主要包括两个过程:压缩和解压缩。

1. 压缩过程在压缩过程中,首先初始化滑动窗口的大小和查找缓冲区的大小。

然后,按照基本原理描述的方法,逐个字符地进行压缩编码。

最后,将压缩码和原始数据一同保存,以便后续的解压缩过程。

2. 解压缩过程在解压缩过程中,首先读入之前保存的压缩码和原始数据。

然后,根据压缩码进行解码操作,将压缩码表示的字符串写入输出缓冲区。

最后,输出解码后的数据。

三、应用领域LZSS压缩标准在各个领域都有广泛的应用。

1. 数据压缩LZSS压缩标准可以将大量的数据进行高效压缩,节省存储空间。

它被广泛应用于文件压缩、图像压缩、音频压缩等领域。

2. 数据传输LZSS压缩标准可以在数据传输过程中减少数据的传输量,提高传输效率。

它被应用于网络传输、数据备份等场景。

3. 嵌入式系统LZSS压缩标准对内存空间的利用非常高效,适用于资源有限的嵌入式系统。

它被广泛应用于嵌入式系统的固件压缩和存储。

四、总结LZSS压缩标准是一种经典的无损压缩算法,具有简单高效、广泛应用等特点。

它通过利用已经压缩的数据来替代重复出现的新数据,从而实现数据的高效压缩。

铝的压缩实验报告

铝的压缩实验报告

一、实验目的1. 研究铝在压缩过程中的应力-应变关系;2. 探究铝的压缩强度;3. 分析铝的压缩变形特征。

二、实验原理1. 压缩试验:压缩试验是一种力学性能试验,通过测量材料在压缩过程中的应力-应变关系,可以确定材料的压缩强度、弹性模量等力学性能指标。

2. 应力-应变关系:在压缩过程中,材料内部的应力与应变之间存在一定的关系,通常用应力-应变曲线表示。

三、实验设备1. 拉伸试验机:用于施加压缩载荷;2. 引伸计:用于测量材料的应变;3. 电子秤:用于测量材料的质量;4. 专用压缩试样夹具:用于固定试样;5. 精密游标卡尺:用于测量试样的尺寸。

四、实验材料实验材料为纯铝,规格为φ10mm×15mm。

五、实验步骤1. 将试样清洗干净,用精密游标卡尺测量其直径和长度,并计算截面积;2. 将试样放入专用压缩试样夹具中,确保试样与夹具接触良好;3. 将试样夹具安装在拉伸试验机上,并调整试验机的加载速度;4. 开启试验机,对试样施加压缩载荷,同时启动引伸计记录应变值;5. 当试样发生断裂时,停止加载,记录最大载荷值;6. 根据实验数据,绘制应力-应变曲线。

六、实验结果与分析1. 应力-应变曲线:根据实验数据,绘制铝的应力-应变曲线,如图1所示。

图1 铝的应力-应变曲线从图中可以看出,铝在压缩过程中的应力-应变关系呈非线性,可分为三个阶段:(1)弹性阶段:在应力较低时,铝的应力-应变关系近似线性,说明铝具有良好的弹性;(2)屈服阶段:随着应力的增加,铝的应力-应变关系出现拐点,进入屈服阶段。

此时,铝的变形主要表现为塑性变形;(3)断裂阶段:在屈服阶段之后,铝的应力-应变关系继续增加,直至试样发生断裂。

2. 压缩强度:根据实验数据,计算铝的压缩强度为:σc = Fmax / A = 123.45 MPa其中,Fmax为试样断裂时的最大载荷,A为试样截面积。

3. 压缩变形特征:从实验结果可以看出,铝在压缩过程中的变形主要表现为塑性变形,且随着应力的增加,变形量逐渐增大。

压缩实验报告 材料力学

压缩实验报告 材料力学

压缩实验报告材料力学压缩实验报告材料力学引言材料力学是研究材料在外力作用下的变形和破坏行为的学科。

在材料力学中,压缩实验是一种常用的实验方法,用于研究材料在压力作用下的性能和行为。

本文将对压缩实验进行详细分析和报告。

实验目的本次实验的目的是通过对不同材料的压缩实验,探究材料在压力下的变形特性和破坏行为,进一步了解材料的力学性质。

实验装置和方法本次实验使用了一台万能试验机,配备了压力传感器和位移传感器。

首先,选择不同材料的样品,如金属、塑料和木材等。

然后,将样品放置在试验机的压力板上,并调整试验机的参数,如压力速度和试验温度等。

最后,开始进行压缩实验,记录压力和位移的变化。

实验结果和分析通过对不同材料的压缩实验,我们得到了一系列的实验数据。

以金属样品为例,我们观察到在开始施加压力时,金属样品发生弹性变形,即在去除压力后能够恢复原状。

然而,当压力继续增加时,金属样品开始发生塑性变形,即在去除压力后无法完全恢复原状。

随着压力的增加,金属样品最终达到破坏点,发生破裂。

相比之下,塑料样品在压力作用下呈现出更大的变形。

塑料样品在开始施加压力时立即发生塑性变形,并且在去除压力后无法恢复原状。

塑料样品的破坏点较低,容易发生破裂。

而木材样品的行为与金属和塑料有所不同。

木材样品在开始施加压力时,发生较小的弹性变形。

然而,随着压力的增加,木材样品开始发生塑性变形,并且在去除压力后能够部分恢复原状。

木材样品的破坏点较高,较难发生破裂。

结论通过本次压缩实验,我们可以得出以下结论:1. 不同材料在压力作用下表现出不同的变形特性和破坏行为。

2. 金属样品在压力下发生弹性变形和塑性变形,破坏点较高。

3. 塑料样品在压力下发生塑性变形,破坏点较低。

4. 木材样品在压力下发生弹性变形和塑性变形,破坏点较高。

进一步研究在今后的研究中,我们可以进一步探究不同材料的压缩实验,并研究不同参数对材料性能的影响。

例如,可以研究不同温度下材料的压缩行为,以及不同压力速度对材料的影响。

压缩试验实验报告总结

压缩试验实验报告总结

压缩试验实验报告总结1. 引言压缩试验是材料试验中常用的一种方法,用于评估材料的强度和稳定性。

本次实验旨在通过压缩试验了解材料的力学性质,并分析压缩试验数据。

2. 实验目的- 了解压缩试验的原理和方法;- 分析材料的应力-应变关系;- 计算材料的弹性模量和极限抗压强度;- 掌握实验数据处理和报告撰写方法。

3. 实验装置和方法本次实验使用了电子万能试验机和压缩试验样品。

具体的实验过程如下:1. 制备压缩试验样品,保证样品的尺寸和形状符合要求;2. 将样品安装在电子万能试验机上,并调整仪器参数;3. 开始压缩试验,按照一定速度施加外力,记录载荷和位移数据;4. 在不同载荷下,记录对应的位移数据,得到应力-应变曲线;5. 统计实验数据,计算材料的弹性模量和极限抗压强度。

4. 实验结果通过实验数据的处理和分析,得到了应力-应变曲线,并计算了材料的弹性模量和极限抗压强度。

实验结果如下:- 应力-应变曲线呈现一定的线性关系,表明材料在一定范围内具有良好的弹性行为;- 弹性模量为XXX GPa,表示了材料在弹性阶段内的刚度;- 极限抗压强度为XXX MPa,反映了材料抵抗压缩破坏的能力。

5. 结果分析根据实验结果,我们可以得出以下结论:- 弹性模量反映了材料的刚度,数值越大表示材料越难以发生形变;- 极限抗压强度代表了材料的抗压性能,是材料在压缩荷载下的破坏极限。

同时,我们还发现了实验中的一些问题:- 样品制备的误差可能会对压缩试验结果产生一定的影响;- 实验过程中的外界因素(如温度、湿度等)也可能会对实验结果产生影响。

6. 结论与建议通过本次实验,我们成功地进行了压缩试验,并得到了相关的数据和结果。

基于实验结果的分析,我们可以得出以下结论:- 材料具有一定的弹性,能够在一定范围内恢复形状;- 材料具有一定的承载能力,能够抵抗一定的压缩荷载。

为了提高压缩试验的准确性,我们建议在今后的实验中注意以下几点:- 加强样品制备的规范性和标准化;- 提高实验过程中外界条件的控制;- 进一步扩大样品数量和变化条件的范围,以提高实验结果的统计可靠性。

LZSS压缩算法C语言实现

LZSS压缩算法C语言实现

/*----------------------------------------------------------------------------  Data Compression Program LZSS.C -- A Data Compression Program 4/6/1989 Haruhiko Okumura Use, distribute, and modify this program freely. Please send me your improved versions. PC-V AN SCIENCE PAF01022 NIFTY-Serve -Serve PAF01022 CompuServe 74050,1022 Some changes made June, 2003 by Chris Giese <*****************>, /~geezer - Changed F from 16 to 18, for compatability with Microsoft COMPRESS/EXPAND EXPAND.EXE is on the install disks for MS-DOS version 6 and Windows 3.1 COMPRESS.EXE is in the Win 3.1 SDK, and comes with Borland C++ 3.1 - Changed compress/expand chars on command line from e/d to c/u - Where possible and correct, changed ints to unsigned - Made all functions static - Changed formatting, indenting, global variable names, and function names - Tried to simplify/clarify code in some areas ----------------------------------------------------------------------------*/ #include <stdlib.h> #include <string.h> #include <ctype.h> #include <stdio.h> /* size of ring buffer */ #define N 4096 /* index for root of binary search trees */ #define NIL N /* upper limit for g_match_len. Changed from 18 to 16 for binary compatability with Microsoft COMPRESS.EXE and EXPAND.EXE #define F 18 */ #define F 16 /* encode string into position and length if match_length is greater than this: */ #define THRESHOLD 2/* these assume little-endian CPU like Intel x86 -- need byte-swap function for big endian CPU */ #define READ_LE32(X) *(uint32_t *)(X) #define WRITE_LE32(X,Y) *(uint32_t *)(X) = (Y) /* this assumes sizeof(long)==4 */ typedef unsigned long uint32_t; /* text (input) size counter, code (output) size counter, and counter for reporting progress every 1K bytes */ static unsigned long g_text_size, g_code_size, g_print_count; /* ring buffer of size N, with extra F-1 bytes to facilitate string comparison */ static unsigned char g_ring_buffer[N + F - 1]; /* position and length of longest match; set by insert_node() */ static unsigned g_match_pos, g_match_len; /* left & right children & parent -- these constitute binary search tree */ static unsigned g_left_child[N + 1], g_right_child[N + 257], g_parent[N + 1]; /* input & output files */ static FILE *g_infile, *g_outfile; /***************************************************************************** initialize trees *****************************************************************************/ static void init_tree(void) { unsigned i; /* For i = 0 to N - 1, g_right_child[i] and g_left_child[i] will be the right and left children of node i. These nodes need not be initialized.These are initialized to Also, g_parent[i] is the parent of node i. NIL (= N), which stands for 'not used.' For i = 0 to 255, g_right_child[N + i + 1] is the root of the tree for strings that begin with character i. These are initializedto NIL. Note there are 256 trees. */ for(i = N + 1; i <= N + 256; i++) g_right_child[i] = NIL; for(i = 0; i < N; i++) g_parent[i] = NIL; } /***************************************************************************** Inserts string of length F, g_ring_buffer[r..r+F-1], into one of the trees (g_ring_buffer[r]'th tree) and returns the longest-match position and length via the global variables g_match_pos and g_match_len. If g_match_len = F, then removes the old node in favor of the new one, because the old one will be deleted sooner. Note r plays double role, as tree node and position in buffer. *****************************************************************************/ static void insert_node(int r) { unsigned char *key; unsigned i, p; int cmp; cmp = 1; key = &g_ring_buffer[r]; p = N + 1 + key[0]; g_right_child[r] = g_left_child[r] = NIL; g_match_len = 0; while(1) { if(cmp >= 0) { if(g_right_child[p] != NIL) p = g_right_child[p]; else { g_right_child[p] = r; g_parent[r] = p; return; } } else { if(g_left_child[p] != NIL) p = g_left_child[p]; else { g_left_child[p] = r; g_parent[r] = p; return; } } for(i = 1; i < F; i++) { cmp = key[i] - g_ring_buffer[p + i]; if(cmp != 0) break; } if(i > g_match_len) { g_match_pos = p; g_match_len = i; if(g_match_len >= F) break; } } g_parent[r] = g_parent[p]; g_left_child[r] = g_left_child[p]; g_right_child[r] = g_right_child[p]; g_parent[g_left_child[p]] = r; g_parent[g_right_child[p]] = r; if(g_right_child[g_parent[p]] == p) g_right_child[g_parent[p]] = r; else g_left_child[g_parent[p]] = r; g_parent[p] = NIL; /* remove p */ } /***************************************************************************** deletes node p from tree *****************************************************************************/ static void delete_node(unsigned p) { unsigned q; if(g_parent[p] == NIL) return; /* not in tree */ if(g_right_child[p] == NIL) q = g_left_child[p]; else if(g_left_child[p] == NIL) q = g_right_child[p]; else { q = g_left_child[p]; if(g_right_child[q] != NIL) { do q = g_right_child[q]; while(g_right_child[q] != NIL); g_right_child[g_parent[q]] = g_left_child[q]; g_parent[g_left_child[q]] = g_parent[q]; g_left_child[q] = g_left_child[p]; g_parent[g_left_child[p]] = q; } g_right_child[q] = g_right_child[p]; g_parent[g_right_child[p]] = q; } g_parent[q] = g_parent[p]; if(g_right_child[g_parent[p]] == p) g_right_child[g_parent[p]] = q; else g_left_child[g_parent[p]] = q; g_parent[p] = NIL; } /***************************************************************************** *****************************************************************************/ static void compress(void) { unsigned i, len, r, s, last_match_length, code_buf_ptr; unsigned char code_buf[17], mask; int c; init_tree(); /* initialize trees */ /* code_buf[1..16] saves eight units of code, and code_buf[0] works as eight flags, "1" representing that the unit is an unencoded letter (1 byte), "0" a position-and-length pair (2 bytes). Thus, eight units require at most 16 bytes of code. */ code_buf[0] = 0; code_buf_ptr = mask = 1; s = 0; r = N - F; /* Clear the buffer with any character that will appear often. */ memset(g_ring_buffer + s, ' ', r - s); /* Read F bytes into the last F bytes of the buffer */ for(len = 0; len < F; len++) { c = getc(g_infile); if(c == EOF) break; g_ring_buffer[r + len] = c; } g_text_size = len; if(g_text_size == 0) /* text of size zero */ return; /* Insert the F strings, each of which begins with one or more 'space' characters. Note the order in which these strings are inserted. This way, degenerate trees will be less likely to occur. */ for(i = 1; i <= F; i++) insert_node(r - i); /* Finally, insert the whole string just read. The global variables g_match_len and g_match_pos are set. */ insert_node(r); do { /* g_match_len may be spuriously long near the end of text. */ if(g_match_len > len) g_match_len = len; /* Not long enough match. Send one byte. */ if(g_match_len <= THRESHOLD){ g_match_len = 1; code_buf[0] |= mask; /* 'send one byte' flag */ code_buf[code_buf_ptr] = g_ring_buffer[r]; /* Send uncoded. */ code_buf_ptr++; /* Send position and length pair. Note g_match_len > THRESHOLD. */ } else { code_buf[code_buf_ptr] = (unsigned char)g_match_pos; code_buf_ptr++; code_buf[code_buf_ptr] = (unsigned char) (((g_match_pos >> 4) & 0xF0) | (g_match_len - (THRESHOLD + 1))); code_buf_ptr++; } /* Shift mask left one bit. */ mask <<= 1; if(mask == 0) { /* Send at most 8 units of code together */ for(i = 0; i < code_buf_ptr; i++) putc(code_buf[i], g_outfile); g_code_size += code_buf_ptr; code_buf[0] = 0; code_buf_ptr = mask = 1; } last_match_length = g_match_len; for(i = 0; i < last_match_length; i++) { c = getc(g_infile); if(c == EOF) break; /* Delete old strings and read new bytes */ delete_node(s); g_ring_buffer[s] = c; /* If the position is near the end of buffer, extend the buffer to make string comparison easier. */ if(s < F - 1) g_ring_buffer[s + N] = c; /* Since this is a ring buffer, increment the position modulo N. */ s = (s + 1) & (N - 1); r = (r + 1) & (N - 1); /* Register the string in g_ring_buffer[r..r+F-1] */ insert_node(r); } /* Reports progress each time the g_text_size exceeds multiples of 1024. */ g_text_size += i; if(g_text_size > g_print_count) { printf("%12ld\r", g_text_size); g_print_count += 1024; } while(i++ < last_match_length)/* After the end of text, */ { delete_node(s); /* no need to read, but */ s = (s + 1) & (N - 1); r = (r + 1) & (N - 1); len--; if(len) . */ insert_node(r);/* buffer may not be empty} } while(len > 0); /* until length of string to be processed is zero */ /* Send remaining code. */ if(code_buf_ptr > 1) { for(i = 0; i < code_buf_ptr; i++) putc(code_buf[i], g_outfile); g_code_size += code_buf_ptr; } /* Encoding is done. */ printf("In : %ld bytes\n", g_text_size); printf("Out: %ld bytes\n", g_code_size); /* xxx - floating-point math: */ printf("Out/In: %.3f\n", (double)g_code_size / g_text_size); } /***************************************************************************** Just the reverse of compress() *****************************************************************************/ static void decompress(void) { unsigned r, flags; int c, i, j, k; memset(g_ring_buffer, ' ', N - F); r = N - F; for(flags = 0; ; flags >>= 1) { /* Get a byte. For each bit of this byte: 1=copy one byte literally, from input to output 0=get two more bytes describing length and position of previously-seen data, and copy that data from the ring buffer to output */ if((flags & 0x100) == 0) { c = getc(g_infile); if(c == EOF) break; /* uses higher byte cleverly to count eight */ flags = c | 0xFF00; } /* 1=copy one byte literally, from input to output */ if(flags & 1) { c = getc(g_infile); if(c == EOF) break; putc(c, g_outfile); g_ring_buffer[r] = c; r = (r + 1) & (N - 1); } /* 0=get two more bytes describing length and position of previously- seen data, and copy that data from the ring buffer to output */ else { i = getc(g_infile); if(i == EOF) break; j = getc(g_infile); if(j == EOF) break; i |= ((j & 0xF0) << 4); j = (j & 0x0F) + THRESHOLD; for(k = 0; k <= j; k++) { c = g_ring_buffer[(i + k) & (N - 1)]; putc(c, g_outfile); g_ring_buffer[r] = c; r = (r + 1) & (N - 1); } } } } /***************************************************************************** *****************************************************************************/ int main(int arg_c, char *arg_v[]) { char ms_hdr[14] = "SZDD堭'3A"; unsigned long size; /* check args */ if(arg_c != 4) USAGE: { printf("'lzss c file1 file2' compresses file1 into file2\n" "'lzss u file2 file1' uncompresses file2 into file1\n"); return 1; } if(strpbrk(arg_v[1], "CcUu") == NULL)goto USAGE; /* open input file */ g_infile = fopen(arg_v[2], "rb"); if(g_infile == NULL) { printf("Can't open input file '%s'\n", arg_v[2]); return 2; } /* get size of (uncompressed) input file */ fseek(g_infile, 0, SEEK_END); size = ftell(g_infile); fseek(g_infile, 0, SEEK_SET); /* open output file */ g_outfile = fopen(arg_v[3], "wb"); if(g_outfile == NULL) { printf("Can't open output file '%s'\n", arg_v[3]); fclose(g_infile); return 2; } /* compress or decompress */ if(toupper(*arg_v[1]) == 'C') { /* write Microsoft COMPRESS/EXPAND header */ WRITE_LE32(ms_hdr + 10, size); if(fwrite(ms_hdr, 1, 14, g_outfile) != 14) { printf("Error writing output file '%s'\n", arg_v[3]); fclose(g_infile); fclose(g_outfile); remove(arg_v[3]); } compress(); } else { /* read and validate Microsoft COMPRESS/EXPAND header */ if(fread(ms_hdr, 1, 14, g_infile) != 14) { printf("Error reading input file '%s'\n", arg_v[2]); fclose(g_infile); fclose(g_outfile); remove(arg_v[3]); } if(strncmp(ms_hdr, "SZDD堭'3A", 9)) { printf("Input file '%s' is not COMPRESSed\n", arg_v[2]); fclose(g_infile); fclose(g_outfile); remove(arg_v[3]); } size = READ_LE32(ms_hdr + 10); decompress(); } fclose(g_infile); fclose(g_outfile); return 0; } 。

LZSS压缩算法实验报告

LZSS压缩算法实验报告

LZSS压缩算法实验报告一、引言LZSS是一种常用的压缩算法,被广泛应用于数据压缩领域。

它的核心思想是通过利用数据中存在的重复信息来实现压缩。

本实验主要对LZSS压缩算法进行研究与实验,评估其压缩效果和性能。

二、算法原理LZSS算法是一种基于滑动窗口和查找缓冲区的字典算法。

其主要思想是将输入数据分为两个部分:滑动窗口和查找缓冲区。

滑动窗口维护了最长匹配的前缀字符串,而查找缓冲区则用来寻找重复的字符串。

具体实现步骤如下:1.初始化滑动窗口和查找缓冲区;2.在滑动窗口中寻找与查找缓冲区中最长匹配的字符串;3.若找到匹配字符串,则将其标记为索引和长度的形式;4.若未找到匹配字符串,则将当前字符输出;5.更新滑动窗口和查找缓冲区;6.重复2-5步骤,直到所有字符处理完毕。

三、实验设计本实验的主要目的是评估LZSS压缩算法的压缩效果和性能表现。

为了完成实验,我们设计了以下实验流程:1.实现LZSS压缩和解压缩算法;2.准备不同类型和大小的文件,用于测试压缩算法的效果;3.运行压缩算法,并记录压缩比、压缩时间和解压缩时间;4.对比不同类型和大小的文件的压缩比和压缩时间;5.分析实验结果并给出评估。

四、实验结果与分析我们分别对文本文件、图像文件和音频文件进行了压缩实验。

实验结果如下:1.文本文件压缩实验结果:压缩比为70%,压缩时间为0.5秒,解压缩时间为0.3秒。

2.图像文件压缩实验结果:压缩比为80%,压缩时间为1秒,解压缩时间为0.6秒。

3.音频文件压缩实验结果:压缩比为60%,压缩时间为0.8秒,解压缩时间为0.4秒。

从实验结果可以看出,不同类型的文件对LZSS压缩算法的效果存在差异。

文本文件由于存在大量的重复信息,所以可以获得较高的压缩比。

而图像文件和音频文件的压缩比较低,因为它们的数据特征较为复杂,存在较少的重复信息。

压缩时间和解压缩时间较短,说明LZSS压缩算法具有较好的性能表现。

五、总结本实验通过对LZSS压缩算法的实验研究,评估了其压缩效果和性能表现。

工程力学压缩实验报告

工程力学压缩实验报告

工程力学压缩实验报告工程力学压缩实验报告引言:工程力学是研究物体受力及其变形规律的一门学科,对于工程设计和结构分析至关重要。

在工程力学中,压缩实验是一种常见的实验方法,通过对材料在受力下的压缩性能进行测试,可以得到材料的力学特性参数,为工程设计提供重要依据。

本实验旨在通过对某种材料的压缩实验,探究材料在受力下的变形规律,并分析其力学特性。

实验目的:1. 了解压缩实验的基本原理和方法;2. 掌握压缩实验的操作技巧;3. 分析材料的力学特性,如弹性模量、屈服点等。

实验设备和材料:1. 压力机:用于施加压缩力;2. 压缩试样:选择一种具有一定强度和韧性的材料作为实验对象;3. 弹性应变计:用于测量试样的应变变化。

实验步骤:1. 将试样放置在压力机的工作台上,调整压力机的位置,使其与试样接触;2. 通过调整压力机的压力,使试样受到均匀的压缩力;3. 在试样上安装弹性应变计,并连接到应变计读数仪上;4. 开始施加压缩力,并记录试样的应变变化;5. 持续增加压缩力,直至试样发生破坏;6. 停止施加压缩力,记录试样破坏时的压力值。

实验结果分析:通过实验记录的数据,可以绘制出应力-应变曲线。

根据应力-应变曲线的形状和特点,可以得出以下结论:1. 弹性阶段:在初期施加压缩力时,试样会表现出弹性变形,即在去除压力后能够恢复到原始形状。

此时,应力与应变呈线性关系,可以通过斜率计算出材料的弹性模量。

2. 屈服点:随着压缩力的增加,试样会逐渐进入塑性阶段。

在这个阶段,试样的应变会继续增加,但应力不再线性增加。

当试样达到一定应力时,会出现应力的骤降,这个点被称为屈服点。

屈服点的出现表示试样开始发生塑性变形。

3. 破坏点:当压缩力继续增加,试样最终会达到破坏点。

在破坏点之前,试样可能会出现颈缩现象,即试样断裂前会在某个局部区域出现明显的收缩。

破坏点的出现表示试样无法承受更大的压缩力,发生破坏。

结论:通过本次压缩实验,我们对材料的力学特性有了更深入的了解。

基于LZSS的SIP压缩算法改进研究

基于LZSS的SIP压缩算法改进研究

Ab t a t I S wa n r d c d i t o e n t r y 3 s r c :M si to u e o R5 c r ewo k b GPP n .SI sc o e s t ec l s si n c n r lp o o o .S P Stx — a e n P wa h s n a h a l e s o t r t c 1 I I e t b s d a d o o
基 于文本 的协 议 , 会话 过程 中需 要重传 大量 的数 据 , 在 导致在 会话 建立 过程 中时延 的增加 。文 中在分 析现有 的 SP信令 压 I
缩算 法 的基础 上 , 出 了一种 带有 预处理 的 L S 与算 术编 码相 结合 的改 进算法 。首 先对 消息进 行预 编码 , 提 ZS 然后 进行 L S ZS 压缩 , 压缩 完后 与算 术编 码相 结合 , 这种 改进 后 的算 法 减 少 了信 令传 输 延 迟 。文 中运 用 典 型 的 SP会 话 环境 进 行仿 真 实 I
S u n m pr v m e fS P m pr si n Al o ih t dy a d I o e nto I Co e so g rt m Ba e o s d n LZS S
ZONG i g LU uቤተ መጻሕፍቲ ባይዱP n 。 H
( . o eeo vr a E ua o , nigU iesyo ot &T l o 1 C l g f es s d ct n Naj nvr t f s l O e i n i P s e cmmu i t n , aj g20 4 , hn ; e n a o sN ni 106 C ia ci n 2 C lg f o p t 。 aj gU iesyo ot . ol eo m ue N ni nvr t f s e C r n i P s&T l o e cmmu i t n , aj g 10 6,hn ) e n a o sN ni 0 4 C ia ci n2

IMS中基于LZSS的SIP信令压缩算法研究

IMS中基于LZSS的SIP信令压缩算法研究
C ogi 0 0 5 h a h nqn 40 6 ,C i ) g n Abta t MSw s n o ue t 1 oentokb G P n G PcoeS so iai r oo ( w)a e s c:I a t d edi o L Cr e r y3 P ,ad3 P hs es nI t t nPo cl s r ir n 5 w i ni o t 8h t
J n 0 7 u e2 0
I S中基 于 I S M Z S的 SP信 令压 缩算 法研 究 I
贾 宏, 万晓榆 , 自甫 樊
( 庆邮 电 大学 下一代 网络应 用技 术研 究所 , 庆 4 06 ) 重 重 005 摘
( m o a_ 13 cr) j am o @ 6 .o h n 要 :G P在 R 3P 5核 心 网引入 了 I MS结构 , 选择 会 话初 始 协议 (I ) 为呼 叫/ 话 的控 制 并 SP 作 会
真 分析 。 关键 词 : 话初 始协议 ;iC m ; 令 压缩 ;Z S H f a 会 Sg o p 信 L S ;um n 中 图分类 号 : P 9 .2 T 3 2 T 3 3 0 ; P 1 文献 标识码 : A
Re e r h o I sg ai g c mp e so l o ih b s d o s a c fS P i n l o n r s in a g rt m a e n LZS n I S S i M
压 缩模块 处理 , 的 S C m 消 息再 由压 缩调度 模块 送给 得到 i op g 传输层 , 然后传送到对端的解压调度模块 ; 调度模块 保存 解压
Ke rs esi ia o rt o ( I) i o p in l gC m m s n ZS ;H f n ywod :S s nI t tnPo cl SP ;S C m ;s a o p si ;I S u ma o ni i o g g i n o

无损数据压缩LZW算法实验报告

无损数据压缩LZW算法实验报告

一、实验目的1.掌握LZW算法的编码过程;2.掌握LZW算法的译码过程。

二、实验设备与环境Windows Xp系统与VC++6.0三、实验内容、程序清单及运行结果LZW压缩算法的基本概念:LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String Table)。

在编码时,数据流是输入对象(文本文件的据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。

字符(Character):最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是一个像素的颜色在指定的颜色列表中的索引值;字符串(String):由几个连续的字符组成;前缀(Prefix):也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;根(Root):一个长度的字符串;编码(Code):一个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目。

编写程序,运行程序,添加要压缩的文件和选择存放的位置,如图所示:点击encode后,会提示压缩成功:对于压缩成功后,回到两个文件夹中会有:接下来是解压的过程,同样也是选择解压的文件我解压后存储的位置:点击解压后,程序会自动运行,运行成功后,就有如下图的提示:对于两个文件进行对比,如下图:四、实验结论、实验体会1.对文件使用Lzw技术压缩之后,会生成LZW的文件,经过解压文件后,同样会还原成源文件。

这就证明我们的程序是可行的,同时也解析了lzw压缩技术的,编码和解码过程的字典是一样的。

2.同常情况下,文件经过lzw压缩后,文件的大小会比原来要变小,但是上述实验不同,原因是上述文件已经经过了一些压缩技术的压缩了(例如:相片,视频都是经过的处理的文件),所以在经过lzw技术压缩后的文件会比源文件大。

LZSS压缩算法C语言实现

LZSS压缩算法C语言实现

LZSS压缩算法C语言实现LZSS(Lempel–Ziv–Storer–Szymanski)是一种无损压缩算法,由Lempel-Ziv算法(LZ77)和Storer-Szymanski算法组合而成。

该算法是一种字典压缩算法,通过利用重复的数据块来减小数据的存储空间。

下面是LZSS压缩算法的C语言实现:```c#include <stdio.h>#include <stdlib.h>#include <string.h>//用于存储压缩后的数据typedef structunsigned char *buffer; // 数据缓冲区size_t size; // 缓冲区大小size_t pos; // 当前指针位置//初始化压缩数据结构data->buffer = (unsigned char *)malloc(sizeof(unsigned char) * size);data->size = size;data->pos = 0;return data;//释放压缩数据结构所占内存free(data->buffer);free(data);//获取长度和偏移之间的编码void getLengthOffset(int length, int offset, unsigned char *code)code[0] = ((length - 3) << 4) , (offset >> 8);code[1] = offset & 0xFF;//压缩函数int lookaheadBuffer = 6; // 向前看缓冲区的大小int searchBuffer = 4096; // 缓冲区的大小int i = 0;while (i < size)int length = 0;int offset = 0;int j;for (j = 0; j < searchBuffer && j < i; j++)int k;for (k = 0; k < lookaheadBuffer && i + k < size; k++) if (input[i - j + k] != input[i + k])break;}}if (k > length)length = k;offset = j;}}if (length < 3)output->buffer[output->pos++] = input[i++];} elseunsigned char code[2];getLengthOffset(length, offset, code);output->buffer[output->pos++] = code[0];output->buffer[output->pos++] = code[1];i += length;}}return output;//解压缩函数size_t pos = 0;size_t i = 0;while (i < size)unsigned char code = input[i++];if ((code & (1 << (7 - j))) == 0)output[pos++] = input[i++];} elseunsigned char lengthOffsetCode = input[i++];int length = ((lengthOffsetCode >> 4) & 0x0F) + 3;int offset = ((lengthOffsetCode & 0x0F) << 8) , input[i++]; output[pos] = output[pos - offset];pos++;}}}}return output;int maiunsigned char input[] = "LZSS压缩算法示例测试";size_t size = sizeof(input) - 1;printf("原始数据:\n%s\n\n", input);printf("压缩后的数据:\n");}printf("\n\n");return 0;```您可以使用该代码进行测试,并根据自己的需求进行修改和优化。

压缩实验实验报告2024

压缩实验实验报告2024

篇章一:引言概述在物理学实验中,压缩实验是一种常见的实验方法,用于研究物体在受压力作用下的力学性质。

本实验旨在通过对物体的压缩过程进行观察和分析,从而深入理解压缩力学的基本原理。

通过实验结果的观察和分析,可以得出一定的结论,并为相关领域的研究提供参考。

篇章二:实验前准备2.1 实验材料和装置准备本次实验需要准备的材料和装置包括:压缩实验装置、弹簧、负荷、示波器、电源等。

实验装置应该经过检查,以确保其正常工作,并根据需求调整合适的实验参数。

2.2 实验目标和预期结果本实验的主要目标是研究物体在受到压力作用下的压缩力学性质。

预期结果包括:能够观察到物体的压缩过程,并测量压缩力、弹性系数等物理量,从而得出相关结论。

篇章三:实验过程和数据处理3.1 实验步骤3.1.1 设置实验装置首先,将压缩实验装置放置在实验台上,并将所需的材料和装置连接起来。

调整装置,使之处于合适的工作状态。

3.1.2 加载负荷根据实验要求,加装合适的负荷,并记录下负荷的数值。

注意,负荷的加装过程应该缓慢进行,以避免对实验装置和样品造成损坏。

3.1.3 观察和记录压缩过程通过示波器观察物体压缩的过程,并记录下关键的数据,比如实验开始时的长度、实验进行中的长度等。

3.2 数据处理和分析3.2.1 绘制压缩曲线根据实验记录的数据,绘制出物体的压缩曲线。

对于每个负荷值,记录下相应的压缩量,并绘制出与压缩量的关系曲线。

3.2.2 计算弹性系数通过压缩曲线的斜率计算物体的弹性系数。

根据一定的公式和数据分析方法,得出相应的结果,并进行数据修正和误差分析。

篇章四:实验结果与讨论4.1 压缩实验观察结果根据实验记录的数据和观察,对不同负荷值下物体的压缩过程进行详细的描述。

结合压缩曲线和弹性系数的计算结果,对实验结果进行分析。

4.2 弹性模量的计算和分析根据实验结果,计算物体的弹性模量。

通过与理论值的比较,评估实验结果的准确性和可靠性。

4.3 数据修正和误差分析根据实验过程中可能存在的误差来源,对实验数据进行修正。

LZSS压缩算法实验报告

LZSS压缩算法实验报告

实验名称:LZSS压缩算法实验报告一、实验内容使用Visual 6..0 C++编程实现LZ77压缩算法。

二、实验目的用LZSS实现文件的压缩。

三、实验原理LZSS压缩算法是词典编码无损压缩技术的一种。

LZSS压缩算法的字典模型使用了自适应的方式,也就是说,将已经编码过的信息作为字典,四、实验环境1、软件环境:Visual C++ 6.02、编程语言:C++五、实验代码#include <stdlib.h>#include <string.h>#include <ctype.h>#include <stdio.h>/* size of ring buffer */#define N 4096/* index for root of binary search trees */#define NIL N/* upper limit for g_match_len. Changed from 18 to 16 for binarycompatability with Microsoft COMPRESS.EXE and EXPAND.EXE#define F 18 */#define F 16/* encode string into position and lengthif match_length is greater than this: */#define THRESHOLD 2/* these assume little-endian CPU like Intel x86-- need byte-swap function for big endian CPU */#define READ_LE32(X) *(uint32_t *)(X)#define WRITE_LE32(X,Y) *(uint32_t *)(X) = (Y)/* this assumes sizeof(long)==4 */typedef unsigned long uint32_t;/* text (input) size counter, code (output) size counter,and counter for reporting progress every 1K bytes */static unsigned long g_text_size, g_code_size, g_print_count;/* ring buffer of size N, with extra F-1 bytesto facilitate string comparison */static unsigned char g_ring_buffer[N + F - 1];/* position and length of longest match; set by insert_node() */static unsigned g_match_pos, g_match_len;/* left & right children & parent -- these constitute binary search tree */ static unsigned g_left_child[N + 1], g_right_child[N + 257], g_parent[N + 1]; /* input & output files */static FILE *g_infile, *g_outfile;/***************************************************************************** initialize trees*****************************************************************************/ static void init_tree(void){unsigned i;/* For i = 0 to N - 1, g_right_child[i] and g_left_child[i] will be the right and left children of node i. These nodes need not be initialized.Also, g_parent[i] is the parent of node i. These are initialized toNIL (= N), which stands for 'not used.'For i = 0 to 255, g_right_child[N + i + 1] is the root of the treefor strings that begin with character i. These are initializedto NIL. Note there are 256 trees. */for(i = N + 1; i <= N + 256; i++)g_right_child[i] = NIL;for(i = 0; i < N; i++)g_parent[i] = NIL;}/***************************************************************************** Inserts string of length F, g_ring_buffer[r..r+F-1], into one of thetrees (g_ring_buffer[r]'th tree) and returns the longest-match positionand length via the global variables g_match_pos and g_match_len.If g_match_len = F, then removes the old node in favor of the newone, because the old one will be deleted sooner.Note r plays double role, as tree node and position in buffer.*****************************************************************************/ static void insert_node(int r){unsigned char *key;unsigned i, p;int cmp;cmp = 1;key = &g_ring_buffer[r];p = N + 1 + key[0];g_right_child[r] = g_left_child[r] = NIL;g_match_len = 0;while(1){if(cmp >= 0){if(g_right_child[p] != NIL)p = g_right_child[p];else{g_right_child[p] = r;g_parent[r] = p;return;}}else{if(g_left_child[p] != NIL)p = g_left_child[p];else{g_left_child[p] = r;g_parent[r] = p;return;}}for(i = 1; i < F; i++){cmp = key[i] - g_ring_buffer[p + i];if(cmp != 0)break;}if(i > g_match_len){g_match_pos = p;g_match_len = i;if(g_match_len >= F)break;}}g_parent[r] = g_parent[p];g_left_child[r] = g_left_child[p];g_right_child[r] = g_right_child[p];g_parent[g_left_child[p]] = r;g_parent[g_right_child[p]] = r;if(g_right_child[g_parent[p]] == p)g_right_child[g_parent[p]] = r;elseg_left_child[g_parent[p]] = r;g_parent[p] = NIL; /* remove p */}/***************************************************************************** deletes node p from tree*****************************************************************************/ static void delete_node(unsigned p){unsigned q;if(g_parent[p] == NIL)return; /* not in tree */if(g_right_child[p] == NIL)q = g_left_child[p];else if(g_left_child[p] == NIL)q = g_right_child[p];else{q = g_left_child[p];if(g_right_child[q] != NIL){do q = g_right_child[q];while(g_right_child[q] != NIL);g_right_child[g_parent[q]] = g_left_child[q];g_parent[g_left_child[q]] = g_parent[q];g_left_child[q] = g_left_child[p];g_parent[g_left_child[p]] = q;}g_right_child[q] = g_right_child[p];g_parent[g_right_child[p]] = q;}g_parent[q] = g_parent[p];if(g_right_child[g_parent[p]] == p)g_right_child[g_parent[p]] = q;elseg_left_child[g_parent[p]] = q;g_parent[p] = NIL;}/***************************************************************************** *****************************************************************************/ static void compress(void){unsigned i, len, r, s, last_match_length, code_buf_ptr;unsigned char code_buf[17], mask;int c;init_tree(); /* initialize trees *//* code_buf[1..16] saves eight units of code, and code_buf[0] works aseight flags, "1" representing that the unit is an unencoded letter (1 byte), "0" a position-and-length pair (2 bytes). Thus, eight units require at most16 bytes of code. */code_buf[0] = 0;code_buf_ptr = mask = 1;s = 0;r = N - F;/* Clear the buffer with any character that will appear often. */ memset(g_ring_buffer + s, ' ', r - s);/* Read F bytes into the last F bytes of the buffer */for(len = 0; len < F; len++){c = getc(g_infile);if(c == EOF)break;g_ring_buffer[r + len] = c;}g_text_size = len;if(g_text_size == 0) /* text of size zero */return;/* Insert the F strings, each of which begins with one or more 'space' characters. Note the order in which these strings are inserted.This way, degenerate trees will be less likely to occur. */for(i = 1; i <= F; i++)insert_node(r - i);/* Finally, insert the whole string just read. The global variablesg_match_len and g_match_pos are set. */insert_node(r);do{/* g_match_len may be spuriously long near the end of text. */if(g_match_len > len)g_match_len = len;/* Not long enough match. Send one byte. */if(g_match_len <= THRESHOLD){g_match_len = 1;code_buf[0] |= mask; /* 'send one byte' flag */code_buf[code_buf_ptr] = g_ring_buffer[r]; /* Send uncoded. */code_buf_ptr++;/* Send position and length pair. Note g_match_len > THRESHOLD. */ }else{code_buf[code_buf_ptr] = (unsigned char)g_match_pos;code_buf_ptr++;code_buf[code_buf_ptr] = (unsigned char)(((g_match_pos >> 4) & 0xF0) |(g_match_len - (THRESHOLD + 1)));code_buf_ptr++;}/* Shift mask left one bit. */mask <<= 1;if(mask == 0){/* Send at most 8 units of code together */for(i = 0; i < code_buf_ptr; i++)putc(code_buf[i], g_outfile);g_code_size += code_buf_ptr;code_buf[0] = 0;code_buf_ptr = mask = 1;}last_match_length = g_match_len;for(i = 0; i < last_match_length; i++){c = getc(g_infile);break;/* Delete old strings and read new bytes */delete_node(s);g_ring_buffer[s] = c;/* If the position is near the end of buffer, extend the bufferto make string comparison easier. */if(s < F - 1)g_ring_buffer[s + N] = c;/* Since this is a ring buffer, increment the position modulo N. */s = (s + 1) & (N - 1);r = (r + 1) & (N - 1);/* Register the string in g_ring_buffer[r..r+F-1] */insert_node(r);}/* Reports progress each time the g_text_size exceeds multiples of 1024. */ g_text_size += i;if(g_text_size > g_print_count){printf("%12ld\r", g_text_size);g_print_count += 1024;}while(i++ < last_match_length)/* After the end of text, */{delete_node(s); /* no need to read, but */s = (s + 1) & (N - 1);r = (r + 1) & (N - 1);len--;if(len)insert_node(r);/* buffer may not be empty. */}} while(len > 0); /* until length of string to be processed is zero *//* Send remaining code. */if(code_buf_ptr > 1){for(i = 0; i < code_buf_ptr; i++)putc(code_buf[i], g_outfile);g_code_size += code_buf_ptr;}/* Encoding is done. */printf("In : %ld bytes\n", g_text_size);printf("Out: %ld bytes\n", g_code_size);/* xxx - floating-point math: */printf("Out/In: %.3f\n", (double)g_code_size / g_text_size);}/***************************************************************************** Just the reverse of compress()*****************************************************************************/ static void decompress(void){unsigned r, flags;int c, i, j, k;memset(g_ring_buffer, ' ', N - F);r = N - F;for(flags = 0; ; flags >>= 1){/* Get a byte. For each bit of this byte:1=copy one byte literally, from input to output0=get two more bytes describing length and position of previously-seendata, and copy that data from the ring buffer to output */if((flags & 0x100) == 0){c = getc(g_infile);if(c == EOF)break;/* uses higher byte cleverly to count eight */flags = c | 0xFF00;}/* 1=copy one byte literally, from input to output */if(flags & 1){c = getc(g_infile);if(c == EOF)break;putc(c, g_outfile);g_ring_buffer[r] = c;r = (r + 1) & (N - 1);}/* 0=get two more bytes describing length and position of previously-seen data, and copy that data from the ring buffer to output */else{i = getc(g_infile);if(i == EOF)break;j = getc(g_infile);if(j == EOF)break;i |= ((j & 0xF0) << 4);j = (j & 0x0F) + THRESHOLD;for(k = 0; k <= j; k++){c = g_ring_buffer[(i + k) & (N - 1)];putc(c, g_outfile);g_ring_buffer[r] = c;r = (r + 1) & (N - 1);}}}}/***************************************************************************** *****************************************************************************/ int main(int arg_c, char *arg_v[]){char ms_hdr[14] = "SZDD堭'3A";unsigned long size;/* check args */if(arg_c != 4)USAGE: {printf("'lzss c file1 file2' compresses file1 into file2\n""'lzss u file2 file1' uncompresses file2 into file1\n");return 1;}if(strpbrk(arg_v[1], "CcUu") == NULL)goto USAGE;/* open input file */g_infile = fopen(arg_v[2], "rb");if(g_infile == NULL){printf("Can't open input file '%s'\n", arg_v[2]);return 2;}/* get size of (uncompressed) input file */fseek(g_infile, 0, SEEK_END);size = ftell(g_infile);fseek(g_infile, 0, SEEK_SET);/* open output file */g_outfile = fopen(arg_v[3], "wb");if(g_outfile == NULL){printf("Can't open output file '%s'\n", arg_v[3]);fclose(g_infile);return 2;}/* compress or decompress */if(toupper(*arg_v[1]) == 'C'){/* write Microsoft COMPRESS/EXPAND header */WRITE_LE32(ms_hdr + 10, size);if(fwrite(ms_hdr, 1, 14, g_outfile) != 14){printf("Error writing output file '%s'\n", arg_v[3]);fclose(g_infile);fclose(g_outfile);remove(arg_v[3]);}compress();}else{/* read and validate Microsoft COMPRESS/EXPAND header */if(fread(ms_hdr, 1, 14, g_infile) != 14){printf("Error reading input file '%s'\n", arg_v[2]);fclose(g_infile);fclose(g_outfile);remove(arg_v[3]);}if(strncmp(ms_hdr, "SZDD堭'3A", 9)){printf("Input file '%s' is not COMPRESSed\n",arg_v[2]);fclose(g_infile);fclose(g_outfile);remove(arg_v[3]);}size = READ_LE32(ms_hdr + 10);decompress();}fclose(g_infile);fclose(g_outfile);return 0;}六、实验结果如果您需要使用本文档,请点击下载按钮下载!授课:XXX(注:可编辑下载,若有不当之处,请指正,谢谢!)。

工程力学压缩实验报告

工程力学压缩实验报告

一、实验目的1. 理解和掌握工程力学中压缩实验的基本原理和方法。

2. 学习使用万能材料试验机进行压缩实验,并掌握实验操作步骤。

3. 观察和记录不同材料在压缩过程中的变形和破坏现象。

4. 分析和比较不同材料的压缩性能,为工程实际应用提供理论依据。

二、实验原理压缩实验是研究材料在轴向压力作用下的力学性能的一种实验方法。

实验过程中,通过对材料施加轴向压力,使其产生变形,直至破坏,从而测定材料的压缩强度、弹性模量、屈服极限等参数。

压缩实验的原理基于胡克定律和材料的应力-应变关系。

在弹性范围内,材料的应力与应变呈线性关系,即应力-应变曲线呈直线。

当材料超过弹性范围后,应力与应变的关系不再呈线性关系,此时材料发生塑性变形。

三、实验设备与材料1. 万能材料试验机:用于施加轴向压力,测量材料的变形和破坏现象。

2. 游标卡尺:用于测量试样的尺寸。

3. 压缩试样:低碳钢、铸铁等不同材料制成的圆柱形试样。

4. 记录纸、笔:用于记录实验数据。

四、实验步骤1. 准备试样:用游标卡尺测量试样的直径d和高度h,记录数据。

2. 安装试样:将试样放置在万能材料试验机的压板之间,确保试样中心与压板中心对齐。

3. 调整试验机:设置试验机的加载速度,调整试验机至待测状态。

4. 施加载荷:启动试验机,使试样受到轴向压力,观察试样的变形和破坏现象。

5. 记录数据:记录试样的屈服载荷、最大载荷、压缩变形等数据。

6. 实验结束后,整理试样,清洗试验设备。

五、实验结果与分析1. 低碳钢压缩实验实验结果显示,低碳钢在压缩过程中,当载荷达到屈服载荷时,试样出现塑性变形。

随着载荷的增加,试样变形逐渐增大,直至试样断裂。

根据实验数据,可计算出低碳钢的屈服极限、抗压强度等参数。

2. 铸铁压缩实验实验结果显示,铸铁在压缩过程中,当载荷达到一定值后,试样在轴线大约成45°方向上发生断裂。

根据实验数据,可计算出铸铁的抗压强度等参数。

六、实验结论1. 压缩实验是研究材料力学性能的重要方法,可用于测定材料的压缩强度、弹性模量、屈服极限等参数。

【doc】中文文本压缩的LZSSCH算法

【doc】中文文本压缩的LZSSCH算法

中文文本压缩的LZSSCH算法一中文信息第l2卷第1期JOURNALOFCHINESEINFORMA TIONPROCESSINGV o1.12No.1中文文本压缩的LZSSCH算法.华强惠州嘉i两5160l5/【摘要】本文结合中文的特点,从建模编码,自适应索引扩位和最大索引位长等方面对LZSS算法进行了修改,得到的LZSSCH算法对以中文为主的中西文混合文本文件的压缩比平均与LzSS算法高出约8%,而其压缩和扩展速度以及可执行程序的太小均与LZSS算法相当.算法无须任何预处理,还可用于压缩其它非拼音文字文本文件.关键词数据压缩中文文本.LZSS算法c『ji季压文本压缩和LZSS算法厶zS文本文件的压缩必须完全"透明",即完全无损.文本文件的无损数据压缩有两大类建模方法:统计建模和字典建模.统计建模的焦点是如何根据字符出现的频度不同而分配不同长度的编码.统计编码算法包括1952年由霍夫曼提出的霍夫曼编码,1949年先由Shannon,Wearer提出,1961年再由Faro修正的Shannon—Faro编码法,以及由P.Elias提出原始概念的算术编码法.字典建模则利用简单代码代替符号串,这使得编码本身的影响被极大的削弱,而将焦点集中到模型的建立上来.基于字典算法的高压缩性能使它迅速取代了统计编码算法,成为今日无损数据压缩的主流.这两种方法的焦点不同又使得它们可以组合起来使用,即在字典建模的基础上再辅之以后续的统计编码,以形成压缩性能更高的变型一复合算法.由于统计编码相对来说已十分成熟,算法的进一步改进就主要集中在对字典建模的改进上. 字典建模压缩方法中最重要的是Lz方法.现在公认的看法是,"在文本和程序的数据压缩中,除Lz方法之外,不考虑其他方法."[6]例如,IBM公司的ES/9000机上的数据压缩硬件,IBM,STAC,AHA等公司的专用数据压缩Ic芯片以及MS—DOS6和数据压缩工具"Stacker"等均使用LZ方法.Lz方法又分为Lz77和LZ78.LZ77算法是JacobZiv和AbrahamLempel1977年提出的,它只依赖于最近有限上下文本,压缩效率高,实现技术简单.[1]Ziv和Lempel 在1978年又提出了LZ78算法的原理,在某些方面对LZ77作了改进.1982年JamesStorer和ThomasSzymanski建立了LZ77的实用算法LZSS,它采用二分搜索树大大加快了压缩①本文1997年6月3日收到50U.r速度,解码时困无须生成和维护搜索树而更为迅速.1984年,T.welch给出了LZ78算法的实用修正Lzw.[2]它的压缩速度更快,而且理论上已经证明,当输入文本是由一稳定的各态经历的码源产生时,LZW算法的压缩效果随着输入文本的增长而渐进地趋近于最佳压缩.表1几种LZ算法对样本的压缩比比较文件及长度sm5sm6sm7sm8sp5sp6sp7sp8算法(KB)24.743.289.323739.559.478.798.2注:BIOSTIME值与CPU主频有关,表列为PENTIUM133MHZ的值.下同.可以说文本压缩领域目前基本上是LZSS和LZW双雄并立的局面.如采用LZSS 为基础再加上Huffman编码的混合算法LHZ及相应产品LHARC,和用LZSS为基础再加上Shannon编码的混合算法ZIP都是非常着名的实用文本压缩算法.LZSS又以对不同长度的文本文件均有较高压缩比的LZSS12作为代表.LZW的代表则是最大码长为l5位的LZW15.表1和表2是几种Lz算法对两组中文文本文件的压缩比和压缩时间比较.为不失一般性,SM组选用不同长度的不同文件,sP组则是从同一文件的开始起截取的不同长度段;文件的内容既有纯中文的,也有以中文为主而又含有西文的,还有带有公式,表格的中文文本文件;并以LZSS12算法作为对比参照,比较不同算法对同一组样本的压缩效果,以尽可51能减少样本差异性的影响.两组中较短文件的压缩时问差别很小,为节约篇幅没有列入.关于将LZW用于中文文本文件压缩时的改进作者将另文加以讨论;本文专门讨论LZSS用于中文文本文件压缩时可作的改进.2.用于中文文本压缩时对LZSS算法的改进在实际应用LZSS压缩中文文本时,所取得的压缩比往往比西文文本要低不少.例如王忠效,姜丹报导,他们对4个英文文本取得的平均压缩比为2.10,而对8个同类型中文文本取得的平均压缩比为 1.59.[7]Shannon和Weaver1949年将英文视为第二级Markov源,求得英文字符的熵为H(x)=3.1bits,而根据猜字实验得出的统计结果表明,英文字符的熵为H(x)=0.6~1.3bits,当用8bits表示一个英文字符和将其视作离散无记忆信源时,英文文本的压缩比上界CRmax为6~13.[5]而据王世宁,石贵青,徐铮用Shannon 法,徐秉铮,吴立忠等用Cover法估算,汉字的信息熵H(x)≯4.1bits.[3][4]吴军,王作英得到的结果则为5.17bits.[8]那么,按照GB2132—80规定的用16bits表示一个中文字符和将其视作离散无记忆信源时,纯中文文本的压缩比上界CRmax为3--4,确实低于英文文本.然而,LZSS算法毕竟是由西文文本得出的,而中文文本又有着不同于西文本文的特性,例如汉字和符号的双字节内码以及汉字和汉语词出现频率的高度不均匀性等.分析这种特性并据此修正LZSS算法,就可以提高对中文文本文件的压缩比.由于字符出现频率的不均匀性正是不等长编码压缩的基础,中文文本的这一特点要在后续的统计编码中方能加以充分利用,而在编码的影响被极大削弱的字典建模阶段.则应首先针对双字节内码这一特点来优化建模方案.2.1冀模方案的选择GB2132—80规定,每个中文字符用两字节编码,单字节匹配在中文文本压缩中一般无利用价值.为此,首先要将LZSS算法的建模方案改造到与此相适应.考虑的方案有:①LZSCH1算法.以"0"标记后跟12blm索引,以"10"标记后跟14bits不带字节最高位的汉字内码,以"110"标记后跟16bits的连续两个ASCII码,以"111"标记后跟8bim的单个ASCII码.采用字节窗口,单个ASCII码不进窗口.这种方案对纯中文文本的压缩比高,速度也陕,但对混合文本的压缩比不稳定.②LZSCH2算法.以"0"标记后跟12bits索引,以"10"标记后跟14bits不带字节最高位的汉字内码,以"l1"标记后跟8blts的ASCII码.采用字节窗口.③LZSCH3算法.以"0"标记后跟12bim索引,以"11"标记后跟13bits的GB2132—8O已定义符号和汉字的顺序码以"10"标记后跟8bits的ASCII码.采用字节窗口.④LZSCH4算法.以"O"标记后跟12bits索引,以"10"标记后跟8hits的ASCII码,以"110"标记后跟10bits的GB2132—80已定义符号的顺序码.以"111"标记后跟12bits的GB2312—80定义的一级汉字的顺序码.采用字节窗口.不同模型的压缩效果见表3.后三种模型对所有样本的压缩比都高于LZSS12,其中又以LZSCH4最好.需要说明的是,对于某些科技公式等GB2312—80未定义的特殊符号进52行自定义,往往会影响算法的通用性,不如一律按扩展的ASCII码处理.由于特殊符号的出现频度低,这样处理对压缩的负面影响很小,而且一旦这些符号多次出现,它们就很容易成为扩展的ASCII码串得到匹配而实现高压缩.表3不同建模下对样本的压缩比比较2.2自适应索引扩位LZSS的256个字符码必须全部使用,难以安排索引扩位码,增加码位又会降低压缩比,一般取固定的12位索引,以便对不同长度的文件都有较高的压缩比.LZSCH*则可利用中文字符最后的空码作扩位码,实现自适应索引扩位.即一开始只用8位索引,根据文件的长度再逐步增加索引位数,从而可以取得尽可能高的压缩比.表4表明,8—12位自适应的LZSCH6比固定12位的LZSCH4压缩效果更好.2.3最大索引位长采用自适应索引扩位后,还要选择最大索引位长.加大这个值一方面会增加匹配率,从而有利于提高压缩比;但另一方面又会增加平均索引长度和树深,这又不但不利于提高压缩比,还会延长压缩时间,因而要综合考虑确定.表4和表5说明,最大索引位长为l3的LZSCH7压缩比较LZSCH6又有较大提高,压缩时间增加很少;而最大索引位长为14的LzScH8压缩比较LZSCH7则提高不多,压缩时间反倒增加不少.除此之外,最大索引位长为14时的数据结构也比较复杂,并要占用更大得多的内存空间.53表4不同索引位长下对样本的压缩比比较表5不同索引位长下对样本的压缩/扩展时间(BIOSTIME)比较3.结论为尽可能减少样本差异性的影响,以各种算法对同一文本文件的压缩比和压缩/扩展时间与LZSS12的压缩比和压缩时间之比值为相对压缩比和相对压/扩时间,计算两组共16个样本的平均值,与各执行程序的长度和运行空间要求并列于表6.表6几种算法对样本压缩效果的综合比较根据表1~表6,确定以IzsCH7为LZSSCH算法.LZSSCH算法在微机环境下即可运行,无须任何预处理,对以中文为主的中西文混合文本文件的压缩比平均比LZDD12算法高出约8%,压缩和扩展的速度和可执行程序的大小均与LZSS算法相当.LZSSCH同样可以与统计编码压缩组合起来使用,以形成压缩性能更高的变型——复合算法.例如.可以以LZSSCH算法为基础,加上Huifman编码形成复合算法LHZCH.算法也可再增设缓冲区,改用字节I/O来进一步提高I/O速度,这些都将作为本文的后续工作.因此,在用于以中文为主的中西文混合文本文件的压缩时,LZSSCH算法是对LZSS算法的较好改进.算法还可用于压缩其它非拼音文字的文本文件.参考文献[1]ZivJ,LempelA.Auniversalalgorithmforsequentialdatacompression.IEEETransoⅡInformationTheory,1977,23(3)[2]TerryA.Welsh.ATechniqueforHigh-PerformanceDataCompreesionIEEE:ComquterJ une1984[3]徐秉悖,吴立忠,中文文本压缩的LZw算法,华南理工大学(自然科学敝)1989,17(3)[4]贺前华,黎秉悖,彭磊,中文文本压缩的自适应算法.中文信息,1993,7(3)[5]候阳,数据压缩的原理及应用,北京:学苑出皈社,1994[6]吴乐南,数据压缩的原理及应用,北京:电子工业出皈社,1995[7]王忠效,姜丹,关于Lempel—Ziv77压缩算法及其实现的研究,计算机研究与发展,1996.33(s)[8]吴军,王作英,汉语信息墒和语言模型的复杂度,电子,1996,24(10)55THELZSSCHDATACOMPRESS10NALG0RITHMF0RCHINESETEXTFILESHuaQangHuizhouUniversity,GⅢgdorIgHuizhon,516015Abstract:AccordingtothecharacteristicsofChinese.LZSShasbeenmodifiedinitsmod—elingandcoding,inadaptiveindexbitsextension,andinthegreatestindexbitstOgetLZSS. CH.Theaveragecompre*sionratioofLZSSCHtoChinesetectisabout8%higherthan LZSS's.Bothcompressingandexpandingspeed.theSiZeSofexecutableprogramarealike.B e—sides,anypreconditioningisunnecessary,andthismethodcanbeusedtocompressothernon —alphabeticwritingtextfilestOO.Keywords:Datacompression,Chinese,Text,LZSS。

压缩实验报告

压缩实验报告

压缩实验报告压缩实验报告引言:压缩技术是现代信息技术中不可或缺的一部分。

它可以将大量的数据压缩成较小的体积,从而节省存储空间和传输带宽。

本实验旨在探究不同压缩算法的效果,并比较它们的优缺点。

一、实验设备和方法本实验使用了一台配置较高的计算机,并安装了常用的压缩软件。

实验过程中,我们选择了两种常见的压缩算法:Huffman编码和Lempel-Ziv-Welch(LZW)算法。

二、实验过程1. Huffman编码:Huffman编码是一种基于字符出现频率的压缩算法。

它通过构建哈夫曼树,将出现频率较高的字符用较短的编码表示,而出现频率较低的字符用较长的编码表示。

我们首先选择了一个文本文件进行压缩实验。

通过对文件进行统计分析,我们得到了每个字符的出现频率。

然后,根据频率构建了一棵哈夫曼树,并生成了对应的编码表。

最后,我们将原始文本文件使用Huffman编码进行压缩,并记录了压缩后的文件大小。

2. LZW算法:LZW算法是一种基于字典的压缩算法。

它通过建立字典并将输入文本与字典中的条目进行匹配,从而实现压缩。

当输入文本中的字符序列在字典中不存在时,将其添加到字典中,并输出前一个匹配的条目的编码。

我们选择了一段音频文件进行LZW算法的压缩实验。

首先,我们将音频文件转化为二进制数据,并建立一个初始字典,包含所有可能的字符。

然后,按照LZW算法的步骤,将输入文本与字典中的条目进行匹配,并输出对应的编码。

最后,我们记录了压缩后的文件大小。

三、实验结果与分析通过对压缩后的文件大小进行比较,我们得出了以下结论:1. Huffman编码相对于LZW算法,在处理文本文件时具有更好的压缩效果。

这是因为文本文件中存在大量重复的字符,而Huffman编码可以根据字符的出现频率进行编码,从而实现较高的压缩比。

2. LZW算法在处理音频文件时表现更好。

音频文件中的数据通常具有较高的连续性,而LZW算法可以通过建立字典并匹配连续的字符序列,实现较好的压缩效果。

实验二 压缩实验报告

实验二  压缩实验报告

3
实验二 压缩实验报告
1.实验目的:
a. 通过压缩试验测定低碳钢的屈服极限σs 与铸铁的强度极限σb
b. 观察这两种材料在压缩时的破坏现象,并分析其破坏原因。

2.实验设备:
实验机的名称及型号: ____________________________
最大测力范围:压缩: ____________________________
选用测力范围:压缩: ____________________________
量 具 名 称: ____________________________
3.实验记录及计算结果:
1)实验前尺寸:
2)实验数据处理: a. 计算公式:
低碳钢——屈服极限: ==
A P s
s σ (MPa) 铸 铁——强度极限: ==
A P b
b σ (MPa)
c. 作图:(定性图,图形不要失真、各图之间比例要协调):
4.问题讨论:
铸铁试件在压缩时沿与轴线大致成45°的斜截面破坏。

试分析其破坏原因。

指导教师:________________
________年_______月______日
4。

改进的LZSS压缩算法

改进的LZSS压缩算法

改进的LZSS压缩算法王娟 1 刘教民2檀柏红 2(1中国人民武装警察部队学院,河北廊坊065000;2河北省教育厅,河北石家庄 050000) 摘要:本文提出了LZSS压缩算法在进行文本压缩时存在的问题,并给出了解决方法。

改进后的算法具有较高的压缩率,实验结果令人满意。

关键词:LZSS;数据压缩1 引言随着计算机技术的高速发展,各种系统数据量越来越大,给信息存储特别是网络传输带来诸多的困难,并己成为有效获取和使用信息的瓶颈。

为了节省信息的存储空间和提高信息的传输效率,必须对大量的实际数据进行压缩。

实践中采用数据压缩技术,通常可以节省80%以上的费用,并且使得一些困难问题转而在技术上能够实现。

目前常用的压缩编码方法分为两大类:一类是无损压缩法,也叫熵编码;另一类是有损压缩法,也叫熵压缩法。

熵压缩法压缩了熵,会减少信息量,因而不能完全恢复,对于图像、动画、和音频等多媒体信息是有效的,但对于程序文件、数据库文件等就行不通了。

2 LZSS压缩算法LZSS是词典编码无损压缩技术的一种[1]。

词典编码无损压缩技术主要有LZ77、LZSS、LZ78、LZW等几种基本算法,它们一起垄断了当今的通用数据压缩领域。

LZ78和LZW两种算法的编译码方法较为复杂,实现起来较为困难,而LZ77的压缩率又相对较低,比较而言LZSS算法在单片机上实现起来较为理想,其压缩率较高,编译码算法也较为简单。

LZSS压缩算法的字典模型使用了自适应的方式,也就是说,将已经编码过的信息作为字典,如果要编码的字符串曾经出现过,就输出该字符串的出现位置及长度,否则输出新的字符串。

实际使用时,由于被压缩的文件往往较大,一般使用“滑动窗口压缩”方式,就是将一个虚拟的,可以跟随压缩进程滑动的窗口作为术语字典。

3改进的LZSS压缩算法3.1 LZSS算法存在的问题LZSS算法是一种很好的算法,但是在实现的过程中发现该算法仍有不少可改进之处。

改进算法的思路有两条,一是从过程出发,即提高编码程序的效率,在压缩率保持不变的前提下尽量减少算法复杂度;二是从结果出发,分析压缩代码对,尽量精简压缩代码对每个分量的表示方法,并尽量减少压缩代码所占用的空间,以达到较好的压缩效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static voidinit_tree(void)
{
unsignedi;
/* Fori= 0 to N - 1,g_right_child[i] andg_left_child[i] will be the right and
left children of nodei. These nodes need not be initialized.
and counter for reporting progress every 1K bytes */
static unsigned longg_text_size,g_code_size,g_print_count;
/* ring buffer of size N, with extra F-1 bytes
Also,g_parent[i] is the parent of nodei. These are initialized to
NIL (= N), which stands for 'not used.'
Fori= 0 to 255,g_right_child[N +i+ 1] is the root of the tree
q =g_right_child[p];
else
{
q =g_left_child[p];
if(g_right_child[q] != NIL)
{
do q =g_right_child[q];
while(g_right_child[q] != NIL);
g_right_child[g_parent[q]] =g_left_child[q];
/* encode string into position and length
ifmatch_lengthis greater than this: */
#defineTHRESHOLD2
/* these assume little-endian CPU like Intel x86
-- need byte-swap function for bigendianCPU */
/* Clear the buffer with any character that will appear often. */
memset(g_ring_buffer+ s, '', r - s);
g_parent[i] = NIL;
}
/*****************************************************************************
Inserts string of length F,g_ring_buffer[r..r+F-1], into one of the
to facilitate string comparison */
static unsigned charg_ring_buffer[N + F - 1];
/* position and length of longest match; set byinsert_node() */
static unsignedg_match_pos,g_match_len;
g_match_len= 0;
while(1)
{
if(cmp>= 0)
{
if(g_right_child[p] != NIL)
p =g_right_child[p];
else
{
g_right_child[p] = r;
g_parent[r] = p;
return;
}
}
else
{
if(g_left_child[p] ! position-and-length pair (2 bytes). Thus, eight units require at most
16 bytes of code. */
code_buf[0] = 0;
code_buf_ptr= mask = 1;
s = 0;
r = N - F;
2、编程语言:C++
五、实验代码
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
/* size of ring buffer */
#defineN4096
/* index for root of binary search trees */
static voidinsert_node(intr)
{
unsigned char *key;
unsignedi, p;
intcmp;
cmp= 1;
key = &g_ring_buffer[r];
p = N + 1 + key[0];
g_right_child[r] =g_left_child[r] = NIL;
#define NILN
/* upper limit forg_match_len. Changed from 18 to 16 for binary
compatabilitywith Microsoft COMPRESS.EXE and EXPAND.EXE
#defineF18 */
#defineF16
#defineREAD_LE32(X)*(uint32_t *)(X)
#defineWRITE_LE32(X,Y)*(uint32_t *)(X) = (Y)
/* this assumessizeof(long)==4 */
typedefunsigned longuint32_t;
/* text (input) size counter, code (output) size counter,
*****************************************************************************/
static void compress(void)
{
unsignedi,len, r, s,last_match_length,code_buf_ptr;
g_parent[g_left_child[p]] = r;
g_parent[g_right_child[p]] = r;
if(g_right_child[g_parent[p]] == p)
g_right_child[g_parent[p]] = r;
else
g_left_child[g_parent[p]] = r;
unsigned charcode_buf[17], mask;
intc;
init_tree(); /* initialize trees */
/*code_buf[1..16] saves eight units of code, andcode_buf[0] works as
eight flags, "1" representing that the unit is anunencodedletter (1 byte),
g_parent[g_left_child[q]] =g_parent[q];
g_left_child[q] =g_left_child[p];
g_parent[g_left_child[p]] = q;
}
g_right_child[q] =g_right_child[p];
g_parent[g_right_child[p]] = q;
for strings that begin with characteri. These are initialized
to NIL. Note there are 256 trees. */
for(i= N + 1;i<= N + 256;i++)
g_right_child[i] = NIL;
for(i= 0;i< N;i++)
static voiddelete_node(unsigned p)
{
unsigned q;
if(g_parent[p] == NIL)
return; /* not in tree */
if(g_right_child[p] == NIL)
q =g_left_child[p];
else if(g_left_child[p] == NIL)
p =g_left_child[p];
else
{
g_left_child[p] = r;
g_parent[r] = p;
return;
}
}
for(i= 1;i< F;i++)
{
cmp= key[i] -g_ring_buffer[p +i];
if(cmp!= 0)
break;
}
if(i>g_match_len)
/* left & right children & parent -- these constitute binary search tree */
static unsignedg_left_child[N + 1],g_right_child[N + 257],g_parent[N + 1];
/* input & output files */
}
g_parent[q] =g_parent[p];
相关文档
最新文档