0

我有一个在磁盘上加密的 zip 存档。我将文件读入缓冲区,解密它(使用一些自定义算法),然后在内存中压缩它。

现在我可以修改存档,但如何将更改写回磁盘?我错过了什么吗?存档是在调用时创建的,zip_source_buffer_create(...)并且在调用时zip_close(...)会对内存进行更改。

麦克维:

#include <zip.h>
#include <fstream>
#include <filesystem>
#include <vector>
#include <string>

int main(int argc, char** argv) {

    std::string zip_file = "test.zip";
    size_t file_sz = std::filesystem::file_size("test.zip");
    std::vector<char> buf(file_sz);
    std::ifstream ifs{ zip_file, std::ios::binary };
    ifs.read(buf.data(), file_sz);

    /*
        buffer is decrypted here
    */

    zip_error_t ze;
    zip_error_init(&ze);
    zip_source_t* zip_source = zip_source_buffer_create(buf.data(), buf.size(), 1, &ze);
    zip_t* zip = zip_open_from_source(zip_source, NULL, &ze);

    zip_source_t* file_source = zip_source_buffer(zip, "hello", 6, 0);
    zip_file_add(zip, "hello.txt", file_source, ZIP_FL_ENC_GUESS);
    zip_source_free(file_source);

    zip_error_fini(&ze);
    zip_close(zip); //modifications are written to memory but how do I retrieve the data?

    /*
        zip data should be acquired here, encrypted, and written to disk
    */

    return 0;
}
4

2 回答 2

2

zip_close()将新数据写入zip_source_t打开 zip 的原始数据,在您的情况下,它是包装缓冲区的zip_source变量。vector

zip_close()提交到你的 时,指向(缓冲区)zip_source的输入缓冲区将被 libzip 分配的新数据缓冲区替换。因此,您应该能够调用以确保不会从内存中释放出来,然后您可以根据需要使用and从新的数据缓冲区中读取,然后您可以调用and完成后。zip_sourcevectorzip_source_keep(zip_source)zip_close()zip_sourcezip_source_open(zip_source)zip_source_read(zip_source)zip_sourcezip_source_close(zip_source)zip_source_free(zip_source)

对从中读取的数据做任何你想做的事情zip_source,然后将其保存到你选择的磁盘文件中。

libzip 的 repo 中提供了此过程的示例:

https://github.com/nih-at/libzip/blob/master/examples/in-memory.c

于 2021-03-31T00:48:03.930 回答
0

我在 libzip 发行版中找到了解决方案。文件examples/in-memory.c. 涉及的代码很多,这里就不贴了。

它涉及zip_source_keep在关闭内存中的存档后保持源活动,zip_stat了解读取缓冲区大小和zip_source_open/zip_source_read读取源的内容。

于 2021-03-31T00:41:00.220 回答