Tag: zlib

C.循环压缩+发送(gzip)ZLIB

我目前正在用C构建一个HTTP服务器。 请注意这段代码: #define CHUNK 0x4000 z_stream strm; unsigned char out[CHUNK]; int ret; char buff[200]; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; int windowsBits = 15; int GZIP_ENCODING = 16; ret = deflateInit2(&strm, Z_BEST_SPEED, Z_DEFLATED, windowsBits | GZIP_ENCODING, 1, Z_DEFAULT_STRATEGY); fill(buff); //fill buff with infos do { strm.next_in = (z_const unsigned char *)buff; strm.avail_in […]

无法通过cmake在windows上编译libpng 1.6:无法打开包含文件:’zlib.h’:没有这样的文件或目录

VS 2015 Update 1.预构建的zlib被解压缩到project / zlib中。 find_package通过提供适当的变量找到它。 它将dir添加为cl调用中的包含: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\CL.exe /c /IC:\project\zlib\include /IC:\project\libpng /nologo /W3 /WX- /O2 /Ob2 /D WIN32 /D _WINDOWS /D NDEBUG /D _CRT_SECURE_NO_DEPRECATE /D “CMAKE_INTDIR=\”Release\”” /D _MBCS /Gm- /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Fo”png16_static.dir\Release\\” /Fd”png16_static.dir\Release\png16_static.pdb” /Gd /TC /errorReport:queue C:\project\libpng\png.c C:\project\libpng\pngerror.c C:\project\libpng\pngget.c C:\project\libpng\pngmem.c C:\project\libpng\pngpread.c C:\project\libpng\pngread.c C:\project\libpng\pngrio.c C:\project\libpng\pngrtran.c C:\project\libpng\pngrutil.c […]

zlib:如何维度avail_out

我想使用zlib来缩小一小块内存(<= 16 KiB)。 输出也存储在内存块中。 这里没有磁盘或数据库访问。 根据文档,我应该反复调用deflate() ,直到整个输入被放气。 在这两者之间,我必须增加输出所在的内存块的大小。 然而,这似乎不必要地复杂,甚至可能效率低下。 据我所知输入的大小,我不能预先确定输出所需的最大大小,然后只需调用一次deflate()吗? 如果是这样,最大输出尺寸是多少? 我假设类似:输入大小+一些字节开销

在发送之前压缩数据 – 控制字符?

在多人游戏设置中,我打算在发送之前使用zlib来压缩更大的字符串。 我将结果数据放回到字符串中,这些字符串将使用TCP作为字节流发送。 我的问题是,我还需要将控制字符放入字符串中。 例如,我需要将原始字符串长度(以纯文本格式)添加到压缩字符串的前面,并使用某些符号(如“|”)将其与压缩数据分开。 但我找不到知道哪些字节是实际内容以及哪些字节是控制字符的方法。 是否存在zlib-compressed-string永远不会包含的任何字符(除了0,我不能使用,因为它标记了c-string的结尾),我可以使用它来分离“元数据”和“压缩数据”?

使用zlib C ++缩小和扩充PDF

我正在尝试实现“zlib.h”deflate和inflate函数来压缩和解压缩PDF文件中的流。 输入:来自PDF文件的压缩流。 我实现了inflate函数 – 没关系,我有未压缩的流,之后我尝试用deflate函数再次压缩这个流,因为输出我有压缩流,但它不等于输入压缩流,它们不等于长度。 我做错了什么? 这是我的代码的一部分: size_t outsize = (streamend – streamstart) * 10; char* output = new char[outsize]; ZeroMemory(output, outsize); z_stream zstrm; ZeroMemory(&zstrm, sizeof(zstrm)); zstrm.avail_in = streamend – streamstart + 1; zstrm.avail_out = outsize; zstrm.next_in = (Bytef*)(buffer + streamstart);//block of date to infalte zstrm.next_out = (Bytef*)output; int rsti = inflateInit(&zstrm); if (rsti == […]

对于任何真实数据集,数据压缩比的最小可能值是什么

我正在为嵌入式硬件压缩器编写ZLIB就像使用deflate算法压缩给定输入流一样。 在进一步说明之前,我想解释数据压缩率。 数据压缩比定义为未压缩大小和压缩大小之间的比率。 压缩比通常大于1。 这意味着压缩数据通常小于未压缩数据,这是压缩的全部要点。 但情况并非总是如此。 例如,使用ZLIB库和某些Linux机器上生成的伪随机数据,压缩比大致为0.996。 这意味着压缩成10000字节的9960字节。 我知道ZLIB通过使用类型0块来处理这种情况,它只返回带有大约5字节头的原始未压缩数据,因此它只能提供5字节的开销直到64KB的数据块。 这是这个问题的智能解决方案但由于某些原因我不能在我的API中使用它。 我必须提前提供额外的安全空间来处理这种情况。 现在,如果我知道尽可能少的已知数据压缩率,我将很容易计算出我必须提供的额外空间。 否则为了安全起见,我必须提供超过所需的额外空间,这在嵌入式系统中至关重要。 在计算数据压缩率时,我不关心页眉,页脚,极小的数据集和系统特定的细节,因为我单独处理它。 我特别感兴趣的是,是否存在最小尺寸为1K的真实数据集,并且使用deflate算法可以提供小于0.99压缩比。 在这种情况下,计算将是: 压缩比=未压缩的大小/(使用deflate压缩的大小,不包括页眉,页脚和系统特定的开销) 请提供反馈。 任何帮助,将不胜感激。 如果可以提供对这样的数据集的引用,那将是很好的。 编辑: @MSalters评论指出硬件压缩器没有正确地遵循deflate规范,这可能是微代码中的一个错误。

Mac Zlib为架构x86_64定义了符号:

我试图在Xcode中使用zlib.h构建一个简单的程序来读入和膨胀.gz文件。 虽然在建立这个项目时,我却臭名昭着 Undefined symbols for architecture x86_64: “_inflate”, referenced from: decomp() in main.o “_inflateEnd”, referenced from: decomp() in main.o “_inflateInit2_”, referenced from: decomp() in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 对于zlib方法膨胀,inflateEnd等。 #include #include #include int main(){ …inflate method here..} […]

如何在Windows上将libxml2与zlib1链接?

我需要为我的TeamSpeak 3插件编译libxml2 32位和64位二进制文​​件,因为我找不到dll / lib 64位下载。 当我使用我编译的libxml2.dll作为命令提示符应用程序中的依赖项时,它工作得很好。 但是,当我尝试将其用作TeamSpeak 3中的依赖项时,程序会在启动时立即崩溃。 特别是它在这一行崩溃: https://github.com/NobleUplift/TeamSpeak3WebsitePreview/blob/master/ts3websitepreview/plugin.c#L148 这是我在Windows上编译libxml2的批处理脚本: @ECHO OFF CALL “C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat” CD libxml2-2.9.4\win32 nmake clean cscript configure.js compiler=msvc zlib=true prefix=D:\Repos\libxml2\release include=D:\Repos\libxml2\dll\include lib=D:\Repos\libxml2\dll\bin debug=yes nmake nmake install cd ../.. 左侧下载的libxml2.dll可以正常工作。 编译的libxml2.dll在右侧。 我已经尝试使用zlib标志,我将我的zlib标头放在include目录和lib目录中的dll / lib中,但我无法将其链接到DLL中。

具有IDAT的调色板基本PNG,其BTYPE = 00,无压缩,现在使用Adler32代码

我正在研究一些代码,它们可以构建基于调色板的简单PNG文件,而不需要libpng。 输出文件,在此阶段只有IHDR,PLTE,IDAT(x3)和IEND块。 唯一可能有点不同的是,IDAT块中的像素索引值未被压缩,即各种zlib /块头字节如下。 CMF = 0x78。 FLG = 0x9C(此处还有一些其他值,但总是清零第5位)。 块头字节= 0x01(BFINAL = 1,BTYPE = 00)。 从我可以看到代码正确构建文件,但是一些图像查看器拒绝完全显示图像,如果有的话。 MS Paint很高兴。 GIMP很高兴。 LibreOffice Draw很开心。 Ristretto >>读取PNG图像文件时出现致命错误:压缩数据不够。 ImageMagick >>识别:没有足够的图像数据`20160317_PNG_064.png’@ error / png.c / MagickPNGErrorHandler / 1645。 Gnome之眼>>没有足够的图像数据。 我已经通过几个不同的工具放置文件,同样混合结果。 optipng >>没有足够的图像数据。 pngchunks不会报告任何错误。 pngcheck不会报告任何错误。 这是文件20160317_PNG_064.png的hex视图 它产生的图片是这个小的8×8像素图像 。 关于接下来要尝试什么,我有点死路一条。 任何和所有的帮助表示赞赏。 EDIT_000根据@Mark Adler的要求,将问题缩小到Adler32计算是用于在主函数中使用测试数据计算Adler32值的代码。 顺便说一句,它不是很花哨,而且编码非常冗长。 #include #define DEBUG static const unsigned long GC_ADLER32_BASE […]

使用zlib列出android中apk文件的目录结构

我目前正在开发一个Android项目。 由于android apk文件本质上是一个具有不同文件扩展名的zip文件,是否可以使用zlib来归档资产文件夹的目录结构? 目标是编写一些接口,如opendir()和readdir(),以便我可以执行以下操作: DIR* dir = zip_opendir(“somedirectory”); struct dirent* entry; while (0 != (entry = zip_readdir(dir))){ __android_log_print(ANDROID_LOG_ERROR, “DIR”, “entry: %s\n”, entry->d_name); } 除了所有操作都发生在一个zip文件中。