You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

libzip从内存缓冲区写入Zip归档是否可靠?数据损坏排查

使用libzip通过内存缓冲区写入Zip归档时数据损坏问题

我在动态创建Zip归档时,需要将二进制数据作为文件条目写入,同时使用extra_field API添加元数据。但使用内存缓冲区方式创建zip_source时,写入的数据会出现损坏。

相关代码如下:

const std::string diff; // 从外部函数传入并初始化
zip_t z_; // 类成员,已提前初始化
const std::string f; // 虚拟文件名,由函数传入
// 使用unique_ptr管理zip_source_t的生命周期
std::unique_ptr<zip_source_t, void (*)(zip_source_t*)>  p_zf(
    zip_source_buffer_create((const void*)diff.data(), diff.size(), 0, 0),
    [](zip_source_t* p) { if(p) zip_source_free(p); }
);
if (!p_zf)
    throw exception ...;
// 将文件写入归档并初始化字段
const zip_int64_t idx = zip_file_add(z_, f.c_str(), p_zf.get(), ZIP_FL_ENC_GUESS);
if(-1 == idx)
    throw exception ...;
// 写入额外字段
if(zip_file_extra_field_set(z_, idx, FS_ZIP_EXTRA_FIELD_ID, 0, (const zip_uint8_t*)&metadata, sizeof(metadata), ZIP_FL_LOCAL))
    throw exception ...;

执行上述代码后,读取归档中的虚拟文件f时内容乱码,但256字节的元数据保存正常。

如果把zip_source_buffer_create替换为:

zip_source_buffer(z_, (const void*)diff.data(), diff.size(), 0)

仍会出现相同的数据损坏问题——文件大小符合预期,但内容被污染。只有通过文件系统API(zip_source_file_create)从临时文件初始化zip_source_t时,所有数据才能正常保存:

std::unique_ptr<zip_source_t, void (*)(zip_source_t*)>  p_zf(
    zip_source_file_create(tmp_filename, 0, -1, 0),
    [](zip_source_t* p) { if(p) zip_source_close(p); }
);

我的代码是否存在错误?diff在zip_source_buffer_create、zip_source_buffer和zip_file_add的作用域内均为const。这会不会是libzip的潜在Bug?我使用的是Ubuntu 22.04 64位系统上的libzip 1.7.3版本。

内容的提问来源于stack exchange,提问作者Emanuele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:55:18