由于某种原因,zlib.deflate过滤器似乎不适用于生成的套接字对stream_socket_pair().可以从第二个套接字读取的所有内容都是双字节zlib头,之后的所有内容都是NULL.
例:
<?php
list($in, $out) = stream_socket_pair(STREAM_PF_UNIX,
STREAM_SOCK_STREAM,
STREAM_IPPROTO_IP);
$params = array('level' => 6, 'window' => 15, 'memory' => 9);
stream_filter_append($in, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
stream_set_blocking($in, 0);
stream_set_blocking($out, 0);
fwrite($in, 'Some big long string.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string, take two.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string - third time is the charm?');
$compressed = fread($out, 1024);
var_dump($compressed);
Run Code Online (Sandbox Code Playgroud)
输出:
string(2) "x?"
string(0) ""
string(0) ""
Run Code Online (Sandbox Code Playgroud)
如果我注释掉调用stream_filter_append(),流写入/读取功能正确,数据全部被转储三次,如果我将zlib过滤流导入文件而不是通过套接字对,压缩数据是写得正确.因此两个部分分别正确运行,但不能一起运行.这是我应该报告的PHP错误,还是我的错误? …
我希望在压缩文本时保持地球上其他所有应用程序(包括Web应用程序)之间的互操作性.由于qCompress和qUncompress似乎与谷物相反,我试图直接从我的Qt应用程序中使用zlib.
我将接受最简单(最简单)的答案,它向我展示如何直接使用带有QByteArray的zlib库或修改qCompress的输出,以便它可以在Qt应用程序之外使用.
这是我的尴尬尝试:
QByteArray tdata = QString("Oh noes!").toUtf8();
QByteArray cdata;
uLongf len = 12 + 1.002*tdata.length();
compress(&cdata, &len, &tdata, tdata.length());
Run Code Online (Sandbox Code Playgroud)
而错误:
错误:无法将'QByteArray*'转换为'Bytef*'以将参数'1'转换为'int compress(Bytef*,uLongf*,const Bytef*,uLong)'
然后我尝试使用QByteArray :: constData()
compress(cdata.constData(), &len, &tdata, tdata.length());
Run Code Online (Sandbox Code Playgroud)
但得到以下错误:
错误:从'const char*'到'Bytef*'的无效转换
我不知道Bytef是什么,所以我开始查看zlib源代码进行调查.但我能找到的就是QtSources/src/3rdparty/zlib/zconf.h
# define Bytef z_Bytef
Run Code Online (Sandbox Code Playgroud)
所以现在我迷失了.
我的公司使用遗留文件格式的Electromiography数据,不再生产.但是,有一些兴趣保持复古兼容性,所以我正在研究为该文件格式编写阅读器的可能性.
通过分析用Delphi编写的非常复杂的前源代码,文件读取器/写入器使用ZLIB,并且在HexEditor内部看起来像二进制ASCII中的文件头("Player","Analyzer"等字段易读),后跟包含原始数据的压缩字符串.
我的疑问是:我应该如何进行以确定:
来自维基百科:
zlib压缩数据通常使用gzip或zlib包装器编写.包装器通过添加标题和尾部来封装原始DEFLATE数据.这提供了流识别和错误检测
这有关系吗?
我很乐意发布更多信息,但我不知道什么是最相关的.
谢谢你的任何提示.
编辑:我有工作应用程序,可以用它来记录任何时间长度的实际数据,如果需要,文件甚至小于1kB.
一些示例文件:
一个新创建的,没有数据流:https://dl.dropbox.com/u/4849855/Mio_File/HeltonEmpty.mio
保存非常短(1秒?)的数据流之后,如上所述:https://dl.dropbox.com/u/4849855/Mio_File/HeltonFilled.mio
另一个来自名为"manco"而不是"Helton"的患者,具有更短的流(非常适合Hex观看):https://dl.dropbox.com/u/4849855/Mio_File/manco_short.mio
说明:每个文件应该是患者(一个人)的文件.在这些文件中,保存一个或多个考试,每个考试由一个或多个时间序列组成.提供的文件只包含一个考试,其中包含一个数据系列.
谢谢你的光临.我自己真的尝试过这个,但是再一次对我来说似乎太过分了.
AddHandler application/x-httpd-php .html .htm .php .js
php_flag output_buffering On
php_value output_handler ob_gzhandler
php_flag zlib.output_compression Off
Run Code Online (Sandbox Code Playgroud)
我通过使用GIDZipTest确认它正在工作.这一切都很好,我喜欢它.
但是只要我将.css放到AddHandler列表中,我的页面就会完全中断.
我尝试使用带有ob_gzhandler的php解决方案仅用于css文件,但它最终完全没有工作.只是做什么都没有.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
Run Code Online (Sandbox Code Playgroud)
这也很好.
提前感谢您给出的任何评论.
此致
玛丽安
我使用一个开源渲染库(Ogre3D),它依赖于zlib.
在XCode5中,我注意到在构建iOS时,如果ARCHS设置指示64位(arm64)体系结构,则不会构建zlib.
我得到关于LSEEK宏read和write函数的"隐式函数声明"的错误.我抬头看了LSEEKgzlib.c:
#if defined(_WIN32) && !defined(__BORLANDC__)
# define LSEEK _lseeki64
#else
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
# define LSEEK lseek
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
我的猜测是错误的,但我不知道是什么.至于read()和write()我没有任何线索.
我想从Web服务器下载gzipped csv文件,然后在浏览器中下载ungzip.
到目前为止,我已尝试使用pako并zlib在我的服务器上取一个文件gzip,但有各种问题.试图解压缩unix-gzip文件,我不断收到错误的标题消息.
接下来,我尝试使用node来压缩服务器上的文件,目前我收到此错误
Uncaught Error: invalid file signature:,?
Run Code Online (Sandbox Code Playgroud)
这是我用来获取文件的命令:
$.ajax({ type: "GET", url: 'public/pols_zlib.csv.gz'})
.done(function(d){
var gunzip = new Zlib.Gunzip(d);
plain = gunzip.decompress();
});
Run Code Online (Sandbox Code Playgroud)
我正在寻找任何方式来压缩我的服务器上的文件并在浏览器中解压缩它.
我需要在C++中对std :: string进行简单的压缩和解压缩.我查看了这个站点,代码是用于Character数组.我想要实现的是两个功能:
std::string original = "This is to be compressed!!!!";
std::string compressed = string_compress(original);
std::cout << compressed << std::endl;
std::string decompressed = string_decompress(compressed);
std::cout << decompressed << std::endl;
Run Code Online (Sandbox Code Playgroud)
我曾尝试将boost压缩为:
std::string CompressData(const std::string &data)
{
std::stringstream compressed;
std::stringstream decompressed;
decompressed << data;
boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
out.push(boost::iostreams::zlib_compressor());
out.push(decompressed);
boost::iostreams::copy(out, compressed);
return compressed.str();
}
std::string DecompressData(const std::string &data)
{
std::stringstream compressed;
std::stringstream decompressed;
compressed << data;
boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::zlib_decompressor());
in.push(compressed);
boost::iostreams::copy(in, decompressed);
return decompressed.str();
}
Run Code Online (Sandbox Code Playgroud)
但是代码有时会在字符串中给出Null字符,即\ u0000.如果压缩数据包含这些空字符,我该如何处理.返回类型字符串是否正确?我怎样才能实现功能 …
在zlib的文档指定一个可以传递一个负windowBits参数的deflateInit2()函数:
windowBits对于原始放气,也可以是-8 ..- 15 .在这种情况下,-windowBits确定窗口大小.deflate()然后将生成deflate没有zlib头或尾部的原始数据,并且不会计算adler32检查值.
我在我的C代码中使用这一点,并在Java中我能够膨胀从而通过将压缩字节true的nowrap参数给充气构造.
但是,将参数传递true给Deflater不会产生原始deflate.它返回的字节比我的C实现多20个字节,这肯定听起来像标题和校验和.(传递对于产量甚至更长字节数组).nowrapfalsenowrap
我已经扫描了 Deflater文档但是没有找到指定窗口位的方法或者我想要一个原始的deflate.这个图书馆可以吗?或者我是否需要使用其他一些实现来获取Java中的原始deflate?
我们在git中有一些非常大的存储库,在这些中我们已经观察到克隆/拉取时远程/服务器压缩是一个瓶颈.考虑到git已经变得多么普遍,并且使用了zlib,这个zlib压缩是否已经过优化?
英特尔的一篇论文详细介绍了如何在压缩比较小的情况下将DEFLATE压缩速度提高约4倍:
另一篇论文表明,对于大多数压缩'水平'(1-9),压缩比保持在~1.8倍的速度:
后一种优化似乎可以在github上找到:https://github.com/jtkukunas/zlib
zlib似乎已经很老了(在这个快节奏的行业中)最新版本是从2013年4月开始的.有没有尝试过SIMD优化zlib用于新一代处理器?或者有没有替代在git中使用zlib?
我知道你可以在git中指定一个会影响速度和压缩比的压缩级别.但是,上面表明可以在不损害压缩比的情况下对zlib进行相当大的性能改进.
那么回顾一下,是否有任何现有的git实现使用高度优化的zlib或zlib替代方案?
PS:似乎很多开发/服务器都会从中受益(即使是温室气体排放;)).
我正在将项目的代码从1998版的zlib更新为2013版的zlib.似乎改变的一件事是,uncompress函数曾经有一个"use_crc"标志,似乎已经丢失了:
int ZEXPORT uncompress (dest, destLen, source, sourceLen, use_crc)
Bytef *dest;
uLongf *destLen;
const Bytef *source;
uLong sourceLen;
int use_crc; // <-- vanished (?)
Run Code Online (Sandbox Code Playgroud)
(更新:正如@Joe所指出的,这很可能是第三方修改.标题也相应更新.问题的其余部分仍然适用,例如,"我应该如何利用今天的股票zlib做到最好".)
在我正在研究的代码中,uncompress()被解析为.zip的二进制格式并传入数据的"有效负载".代码已经将crc标志传递为1.如果未使用该标志,则会获得Z_DATA_ERROR(-3).(没有use_crc标志的zlib获得Z_DATA_ERROR,就像标志为false一样.)
在实验中,我发现非常小的文件没有use_crc.然后小的计数文件交叉到"12345678901234"和之间不工作"123456789012345".原因是:这是第一个被放气而不是存储未压缩的文件(在什么拉链称为"6%"的节省)
在挣扎着让zlib接受它的选项时,我尝试了很多东西.这包括尝试16 + MAX_WBITS.似乎没有任何东西像zip test.zip test.txt那样处理旧有代码的方式.
如果我愿意从我的目的地大小中减去一个,我似乎能够抑制错误检查......丢失一个字节.这是简单的测试程序,最小拉链有效负载硬编码:
#include <stdio.h>
#include "zlib.h"
int main(int argc, char *argv[]) {
char compressed[] = { 0x78, 0x9C, 0x33, 0x34, 0x32, 0x36, 0x31, 0x35, 0x33,
0xB7, 0xB0, 0x34, 0x30, 0x04, 0xB1, 0xB8, 0x00, 0x31, 0x30, 0xB1, …Run Code Online (Sandbox Code Playgroud) zlib ×10
compression ×3
c++ ×2
gzip ×2
.htaccess ×1
arm64 ×1
binaryfiles ×1
boost ×1
browser ×1
c ×1
css ×1
deflate ×1
git ×1
ios ×1
java ×1
javascript ×1
ogre ×1
optimization ×1
performance ×1
php ×1
qt ×1
sockets ×1
stream ×1
xcode ×1