********************lzf.h*************************************************************************************************
/***********************************************************************
**
** lzf -- an extremely fast/free compression/decompression-method 一种非常快速/免费的压缩/解压方法
** http://liblzf.plan9.de/
**
** This algorithm is believed to be patent-free. 这种算法被认为是无专利的
**
***********************************************************************/
#define LZF_VERSION 0x0105 /* 1.5, API version */ LZF的版本,方便压缩数据之间的兼容
/*
* Compress in_len bytes stored at the memory block starting at
* in_data and write the result to out_data, up to a maximum length
* of out_len bytes.
压缩存储在内存块中从in_data开始的in_len长字节的数据,
将压缩结果写入到out_data中,最大的长度为out_len个字节
*
* If the output buffer is not large enough or any error occurs return 0,
* otherwise return the number of bytes used, which might be considerably
* more than in_len (but less than 104% of the original size), so it
* makes sense to always use out_len == in_len - 1), to ensure _some_
* compression, and store the data uncompressed otherwise (with a flag, of
* course.
如果输出的缓存不够大或者任何错误发生,返回0,否则返回使用过的字节数,这个可能超过输入的长度in_len
(但是会少于原大小的百分之104),所以使用out_len == in_len - 1 时有意义的,确保压缩结果,否则保存不压缩的结果,当然需要带标志
* lzf_compress might use different algorithms on different systems and
* even different runs, thus might result in different compressed strings
* depending on the phase of the moon or similar factors. However, all
* these strings are architecture-independent and will result in the
* original data when decompressed using lzf_decompress.
lzf压缩算法使用在不同的系统甚至不同的运行中使用不同的系统,这个可能导致基于指标或者类似的因素产生不同的压缩字符串。
然而,所有的压缩字符串都时独立于体系结构的,如果使用lzf解压都能获得原始的数据
*
* The buffers must not be overlapping. 缓存不能重叠
*
* If the option LZF_STATE_ARG is enabled, an extra argument must be
* supplied which is not reflected in this header file. Refer to lzfP.h
* and lzf_c.c.
如果选项LZF_STATE_ARG是有效的,一个额外参数必需提供,该参数不会反映在这个头文件,参见头文件lzfP.h 和 lzf_c.c
*/
unsigned int
lzf_compress (const void *const in_data, unsigned int in_len,
void *out_data, unsigned int out_len);
/*
* Decompress data compressed with some version of the lzf_compress
* function and stored at location in_data and length in_len. The result
* will be stored at out_data up to a maximum of out_len characters.
解压使用某个lzf压缩函数压缩的保存在in_data中的数据,长度为in_len。将结果保存到out_data中,最大长度为out_len个字符
* If the output buffer is not large enough to hold the decompressed
* data, a 0 is returned and errno is set to E2BIG. Otherwise the number
* of decompressed bytes (i.e. the original length of the data) is
* returned.
如果输出的缓存不是足够大能保持解压的数据,0会返回,错误代码会设置为E2BIG。否则返回解压后的字节数(例如,数据的原始长度)
* If an error in the compressed data is detected, a zero is returned and
* errno is set to EINVAL.
如果有错误在压缩的数据中发现,返回0, 错误码设置为EINVAL
* This function is very fast, about as fast as a copying loop.
这个函数是非常快的,和拷贝循环一样的快!
*/
unsigned int
lzf_decompress (const void *const in_data, unsigned int in_len,
void *out_data, unsigned int out_len);
#endif
*********************************************************************************************************************
***************************************lzfP.h************************************************************************
#ifndef LZFP_h
#define LZFP_h
#define STANDALONE 1 /* at the moment, this is ok. */
#ifndef STANDALONE
# include "lzf.h"
#endif
/*
* Size of hashtable is (1 << HLOG) * sizeof (char *) hash表的大小为 (1 << HLOG) * sizeof (char *)
* decompression is independent of the hash table size 解压同hash表大小无关
* the difference between 15 and 14 is very small HLOG为14和15之间的差距很小
* for small blocks (and 14 is usually a bit faster). 对于小的块(14通常会快一点)
* For a low-memory/faster configuration, use HLOG == 13; 对于一个低内存/高速 的配置,使用HLOG为13
* For best compression, use 15 or 16 (or more, up to 22). 对一个最好的压缩比,使用15或者16(或者更多到22)
*/
#ifndef HLOG
# define HLOG 16
#endif
/*
* Sacrifice very little compression quality in favour of compression speed.
* This gives almost the same compression as the default code, and is
* (very roughly) 15% faster. This is the preferred mode of operation.
*/
牺牲很少的压缩质量从而提高压缩的速度。这个提供了几乎于原代码相同的压缩比,但是能提高百分之15的速度(粗略计算)。
这个是优选的操作
#ifndef VERY_FAST
# define VERY_FAST 1
#endif
/*
* Sacrifice some more compression quality in favour of compression speed.
* (roughly 1-2% worse compression for large blocks and
* 9-10% for small, redundant, blocks and >>20% better speed in both cases)
* In short: when in need for speed, enable this for binary data,
* possibly disable this for text data.
*/
为了压缩速度牺牲一些压缩质量(对大数据块的压缩比大约差百分之1到2,对于冗余的小的块差百分之9到10,
但是对于这两种情况可以获得大于百分之20的速度)。简单的说,如果需要提高速度,
对于二进制数据使用这个选项,对于文本数据关闭这个选项
#ifndef ULTRA_FAST
# define ULTRA_FAST 0
#endif
/*
* Unconditionally aligning does not cost very much, so do it if unsure
无条件对齐 不会花费很多代价,所以如果不确定就这样做(即对齐)
*/
#ifndef STRICT_ALIGN
# if !(defined(__i386) || defined (__amd64))
# define STRICT_ALIGN 1
# else
# define STRICT_ALIGN 0
# endif
#endif
/*
* You may choose to pre-set the hash table (might be faster on some
* modern cpus and large (>>64k) blocks, and also makes compression
* deterministic/repeatable when the configuration otherwise is the same).
*/
你可以选择预设hash表(这样可能使得在某些现代cpu和大数据块(大于64k)速度更快,
并且在其它配置相同时,使得压缩具有确定性和重复性)
#ifndef INIT_HTAB
# define INIT_HTAB 0
#endif
/*
* Avoid assigning values to errno variable? for some embedding purposes
* (linux kernel for example), this is necessary. NOTE: this breaks
* the documentation in lzf.h. Avoiding errno has no speed impact.
*/
避免关联错误信息到变量errno,这是为了嵌入目的考虑的(例如Linux内核),那么这个就和必要。(不能同内核错误混在一起)
注意:这种情况打破了文档lzf.h中的描述。 避免错误代码不影响速度
#ifndef AVOID_ERRNO
# define AVOID_ERRNO 0
#endif
/*
* Whether to pass the LZF_STATE variable as argument, or allocate it
* on the stack. For small-stack environments, define this to 1.
* NOTE: this breaks the prototype in lzf.h.
*/
是否传入LZF_STATE变量当做一个参数,或者分配在栈上分配它。对于一个小栈的环境,定义为1.
注意:这种情况不同于定于在lzf.h中的原型
#ifndef LZF_STATE_ARG
# define LZF_STATE_ARG 0
#endif
/*
* Whether to add extra checks for input validity in lzf_decompress
* and return EINVAL if the input stream has been corrupted. This
* only shields against overflowing the input buffer and will not
* detect most corrupted streams.
* This check is not normally noticeable on modern hardware
* (<1% slowdown), but might slow down older cpus considerably.
*/
是否对输入lzf解压数据的有效性添加额外的检查,如果输入的流损坏,返回EINVAL。
这个值针对输入缓冲区的溢出,不会检车更多的损坏数据流。
这个检查在现代硬件上不会很明显降低速速(小于百分之1的降速),但是对老的cpu会有明显的降速
#ifndef CHECK_INPUT
# define CHECK_INPUT 1
#endif
/*
* Whether to store pointers or offsets inside the hash table. On
* 64 bit architetcures, pointers take up twice as much space,
* and might also be slower. Default is to autodetect.
*/
是否在hash表内部保存指针或者偏移量。在64比特架构中,指正需要使用两倍的空间,
可能导致变慢。默认是自动检测(是否使用保存模式)
/*#define LZF_USER_OFFSETS autodetect */
/*****************************************************************************/
/* nothing should be changed below */ 以下不允许修改
#ifdef __cplusplus
# include <cstring>
# include <climits>
using namespace std;
#else
# include <string.h>
# include <limits.h>
#endif
#ifndef LZF_USE_OFFSETS
# if defined (WIN32) Windows平台
# define LZF_USE_OFFSETS defined(_M_X64) 根据是否定义了_M_X64 来设定 LZF_USE_OFFSETS的值
-- https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?redirectedfrom=MSDN&view=msvc-160
-- _M_X64 Defined as the integer literal value 100 for compilations that target x64 processors. Otherwise, undefined.
# else
# if __cplusplus > 199711L 大于这值就用c++的库
# include <cstdint>
# else
# include <stdint.h> 小于就用c库
# endif
# define LZF_USE_OFFSETS (UINTPTR_MAX > 0xffffffffU) 是否大于0xffffffffU来设定 LZF_USE_OFFSETS的值
# endif
#endif
typedef unsigned char u8;
#if LZF_USE_OFFSETS 如果定义偏移量为1
# define LZF_HSLOT_BIAS ((const u8 *)in_data) 就从输入数据开始的点为偏移量
typedef unsigned int LZF_HSLOT; 用整型
#else
# define LZF_HSLOT_BIAS 0
typedef const u8 *LZF_HSLOT; 单个字节
#endif
typedef LZF_HSLOT LZF_STATE[1 << (HLOG)]; 定义一个2^16的数组,具体大小更上面定义的变量类型有关
#if !STRICT_ALIGN
/* for unaligned accesses we need a 16 bit datatype. */ 对于没有对齐的访问,我们需要一个16位的数据类型
# if USHRT_MAX == 65535 如果shot的最大值为65535,那么16位使用short即可
typedef unsigned short u16;
# elif UINT_MAX == 65535 如果int的最大值为65535,那么使用int
typedef unsigned int u16;
# else
# undef STRICT_ALIGN
# define STRICT_ALIGN 1 严格对齐为1
# endif
#endif
#if ULTRA_FAST 如果定义了超级快
# undef VERY_FAST 取消 非常快的定义
#endif
#endif
*********************************************************************************************************************