全部,
我只是想使用 dev-c++ 让 zpipe 演示工作,其中我导入了所有 zlib 代码并使用 zpipe.c 作为示例。一切都编译并运行。如果我尝试使用注释掉的 deflateInit2 调用创建 gzip 文件,它会创建现在错误,但在使用 7zip 解压缩时会损坏。如果我使用标准 zlib 标头来创建文件,当我使用相应的调用来 inflate 时,它会返回 -3/Z_DATA_ERROR ,表明我的默认数据已损坏。一切都表明定义中有问题,但它几乎就是这个例子。
有任何想法吗??非常感谢!
int main(int argc, char **argv)
{
int ret;
FILE *source;
FILE *zip;
FILE *zipped;
FILE *back;
source = fopen ("C:\\Users\\schmoudm\\Pictures\\caela.jpg", "r");
zip = fopen ("C:\\Core\\RD\\test.gz", "w");
printf ("calling def \n");
ret = def(source, zip, Z_DEFAULT_COMPRESSION);
printf("def return: %i \n", ret);
fclose(source);
fclose(zip);
if (ret == 0) {
printf ("setting up inf \n");
zipped = fopen ("C:\\Core\\RD\\test.gz", "r"); …Run Code Online (Sandbox Code Playgroud) 我有机会预设字典以进行 deflate 压缩。这对我来说是有意义的,因为要压缩的数据相对较小,为 1kb-3kb,而且我有大量代表性示例。要压缩的数据由任意字节序列组成,因此标记化等不是一个好方法。此外,数据显示大量重复(数据示例之间),因此好的字典可能会给出非常好的结果。问题是如何算出好的字典呢?是否有一种算法可以计算最佳字典(给定样本数据)?
我开始研究前缀树,但不清楚如何在这种情况下使用它们。
最好的问候,贾里克
我正在 Rust 中构建一个 git 克隆实现。我已经到了需要解析 packfile 以创建索引的部分,并且我几乎完成了解析。
packfile 中的每个对象都包含一个标头(我已经正确解析了该标头),后跟 zlib 压缩的内容。
值得注意的是,标头中存储的大小是解压缩的大小,因此大于我们必须跳过才能到达下一个标头的实际数据。
Crates.io 显示了 2 个进行 zlib 解压缩并且有多个下载的 crate:
libz-sys:实际上是一个你好世界,几个月来一直如此flate2:这可以轻松正确地缩小数据:
print!("Object type {} size {}", obj_type as u8, obj_size);
println!(" data:\n{}",
String::from_utf8(
ZlibDecoder::new(data).read_exact(obj_size as usize).unwrap()
).unwrap()
);
Run Code Online (Sandbox Code Playgroud)问题就在这里。之后,我需要开始读取下一个对象的标头,但ZlibDecoder没有提供任何方法来检测输入有多大。
它以读者的所有权作为输入,而不是参考。
因此,即使我有对象的输出大小(实际上还有对象的所有数据),因为我不知道输入大小,但我无法开始读取下一个对象头。
如何获得达到预期输出大小所需的压缩输入字节量?如果可能的话,我想避免使用 FFI 调用本机 zlib。
PS:flate2文档提出了一个辅助特征,但我不知道这如何或是否会帮助我
我一直在 mongodb 中使用 WiredTiger 存储引擎的默认(snappy)压缩,并且我想切换到 zlib。但是,我的应用程序中已经有一些用户处于活动状态,并且数据库中有数据,我想确保以最小的中断进行此更改。默认情况似乎是简单地重新创建数据库,例如通过 mongodump 转储并使用 zlib 压缩选项恢复到新数据库,然后指向新数据库。如果我在没有用户处于活动状态时进行切换,那么这很可能会很好地完成任务,但我想知道是否有更好的方法来进行更改,例如实现与现有数据库?
如果它是有用的上下文,则对更好压缩的需求实际上只涉及部分数据。如果有一种方法可以仅为数据库中的某些文档切换到 zlib 压缩,那就太好了。另外,为了以防万一,我正在使用 perl MongoDB.pm。
PS 这是我第一次查询 stackoverflow。我已经寻找答案并尝试遵循适当的提问惯例,但如果我以错误的方式处理问题,请温和地教育我。:)
我正在尝试在 Python 2.7 中解压缩 byte64 编码的字符串。
我可以通过在命令行中运行以下命令来验证我的字符串是否有效:
echo -n "MY_BASE64_ENCODED_STRING" | base64 -d | zcat
Run Code Online (Sandbox Code Playgroud)
但是,如果我在 Python2.7 中运行它:
b64_data = 'MY_BASE64_ENCODED_STRING'
text_data = zlib.decompress(base64.b64decode(b64_data))
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
解压缩数据时出现错误-3:标头检查不正确
我应该向 zlib.decompress 传递额外的参数以使其工作吗?
在 MongoDB 中,WiredTiger 提供了 Zlib 压缩选项。
为了启用 Zlib 压缩选项,我使用以下代码创建了一个集合。
db.createCollection( "questions", { storageEngine: {
wiredTiger: { configString: "blockCompressor=zlib" }}})
Run Code Online (Sandbox Code Playgroud)
我运行了一些简单的测试来测量压缩性能并使用以下数据集存储字符串
{
'_id': <ObjectID>,
'question_id': <Five character string>,
'question': <My question>
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码创建了具有任何压缩选项的另一个集合。
db.createCollection( "questions")
Run Code Online (Sandbox Code Playgroud)
使用以下注释测量数据大小
db.stats(1024*1024).dataSize + db.stats(1024*1024).indexSize
Run Code Online (Sandbox Code Playgroud)
但我无法看到这两个集合之间的压缩差异。我参考了以下链接来实现我的流程。
https://www.mongodb.com/blog/post/new-compression-options-mongodb-30
https://scalegrid.io/blog/enabling-data-compression-in-mongodb-3-0/
我正在尝试确定 OpenJDK 是否受到CVE-2022-37434的影响。
我检查了 OpenJDK源代码,看起来它只使用了 zlib 中的以下方法:
zlib中包含漏洞的方法是inflateGetHeader,因此看起来OpenJDK不受此影响。有人可以确认我的推理是否正确吗?
.gz我有一个在类似文件的对象中查找的应用程序。
Pythongzip.GzipFile支持这一点,但是效率很低 \xe2\x80\x93 当 GzipFile 对象被要求向后查找时,它将倒回到流的开头 ( seek(0)),然后读取所有内容并将其解压缩到所需的偏移量。
不用说,当寻找一个大的数据时,这绝对会降低性能。tar.gz文件(数十 GB)时,这绝对会降低性能。
因此,我希望实现检查点:时不时地存储流状态,当要求向后查找时,仅转到下一个先前存储的检查点,而不是一直倒回到开头。
\n我的问题是围绕gzip/zlib实现:“当前解压缩器状态”由什么组成?它存储在哪里?它有多大?
如何从打开的 GzipFile 对象中复制该状态,然后将其分配回“向后跳转”搜索?
\n注意我无法控制输入 .gz 文件。解决方案必须严格针对只读rb模式的GzipFile。
编辑:查看 CPython 的源代码,这是相关的代码流和数据结构。从顶层 (Python) 到原始 C 排序:
\ngzip._GzipReader.seek() == DecompressReader.seek() <=== 需要更改此设置
\nZlibDecompressor 状态+其深层复制 <=== 需要复制/恢复此内容
\nEDIT2:还在以下位置找到了这个预告片zlib: …
zlib将无法在out-of-source模式下使用cmake成功编译.
我究竟做错了什么?
这是zlib在源中工作:
mkdir test
cd test
mkdir contrib
mkdir build
cp /tmp/zlib-1.2.8.tar.gz contrib
cd contrib
tar xvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
rm zconf.h
cmake .
make
Run Code Online (Sandbox Code Playgroud)
这是zlib失败的源代码:
mkdir test
cd test
mkdir contrib
mkdir build
cp /tmp/zlib-1.2.8.tar.gz contrib
cd contrib
tar xvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
rm zconf.h
cd ../../
echo -e cmake_minimum_required\(VERSION 2.6.4\)\\r\\n\
project\(MyTestApp\)\\r\\n\
\\r\\n\
add_subdirectory\(contrib/zlib-1.2.8\)\\r\\n\
> CMakeLists.txt
cd build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)
它失败了:
/home/blah/test/contrib/zlib-1.2.8/test/example.c:8:18: error: zlib.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
注意:我在做什么?我正在寻找构建zlib的本地副本.我不想涉及系统zlib(我的项目涉及交叉编译).
我没有在/ usr/include中安装zlib.h.(我卸载了zlib-devel)当我确实安装了zlib-devel软件包(然后给我一个zlib的系统安装,我不想要),关于zlib.h的错误发生了变化,而是关于不能找到zconf.h.
病理是一样的.example.c文件找不到正确的头文件.您可以从zlib附带的CMakeLists.txt文件中非常清楚地知道这是如何/为什么发生的.它构建zlib库本身的部分提到了ZLIB_PUBLIC_HDRS,但它构建示例的部分没有提到该变量.因此:它不是在本地寻找标题.(我猜这里)
我收到compressedbytes类型为[] byte 的压缩ASCII文本字节.我面临的问题是,以下过程占用了大量内存,这些内存在函数到达其结束后未被释放,并且在程序的整个运行时期间仍然被占用.
b := bytes.NewReader(compressedbytes)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err = ioutil.ReadAll(r)
if err != nil {
panic(err)
}
Run Code Online (Sandbox Code Playgroud)
我注意到使用的类型是bytes.Buffer,这种类型具有Reset()和Truncate()函数,但它们都不允许释放曾经占用的内存.
该文档的Reset()状态如下:
重置将缓冲区重置为空,但它会保留底层存储以供将来的写入使用.重置与截断(0)相同.
如何取消缓冲区并再次释放内存?我的程序在运行期间需要大约50MB的内存,需要2小时.当我导入zlib压缩的字符串时,程序需要200 MB的内存.
谢谢你的帮助.
===更新
我甚至为解压缩创建了一个单独的函数,并runtime.GC()在程序从该函数返回后手动调用垃圾收集器,但没有成功.
// unpack decompresses zlib compressed bytes
func unpack(packedData []byte) []byte {
b := bytes.NewReader(packedData)
r, err := zlib.NewReader(b)
if err != nil {
panic(err)
}
cleartext, err := ioutil.ReadAll(r)
if …Run Code Online (Sandbox Code Playgroud)