gpt4 book ai didi

c - 如何获取 LZMA2 文件 (.xz/liblzma) 的未压缩大小

转载 作者:太空狗 更新时间:2023-10-29 15:31:02 25 4
gpt4 key购买 nike

我正在寻找一种方法来获取使用 xz 实用程序压缩的 LZMA2/.xz 文件的未压缩流大小。

我正在使用来自 Windows/Linux 的 liblzma 来完成这项任务,所以我想我正在 liblzma 中寻找一些 C/C++ API 来完成这个任务。

最佳答案

我想我找到了解决方案。

这是一个非常粗糙的代码示例,但似乎工作正常。

我假设我有一个 do_mmap() 函数,它将整个文件作为只读文件映射到内存中,并返回映射的总大小。这自然可以适应使用 read/fread/ReadFile 或任何其他文件 API。

extern size_t get_uncompressed_size(const char *filename)
{
lzma_stream_flags stream_flags;
int file_size;

const uint8_t *data = (uint8_t *) do_mmap(filename, &file_size);

// 12 is the size of the footer per the file-spec...
const uint8_t *footer_ptr = data + file_size - 12;

// Something is terribly wrong
if (footer_ptr < data) {
do_unmap((void *)data, file_size);
return -1;
}

// Decode the footer, so we have the backward_size pointing to the index
lzma_stream_footer_decode(&stream_flags, (const uint8_t *)footer_ptr);
// This is the index pointer, where the size is ultimately stored...
const uint8_t *index_ptr = footer_ptr - stream_flags.backward_size;
// Allocate an index
lzma_index *index = lzma_index_init(NULL);
uint64_t memlimit;
size_t in_pos = 0;
// decode the index we calculated
lzma_index_buffer_decode(&index, &memlimit, NULL, index_ptr, &in_pos, footer_ptr - index_ptr);
// Just make sure the whole index was decoded, otherwise, we might be
// dealing with something utterly corrupt
if (in_pos != stream_flags.backward_size) {
do_unmap((void *)data, file_size);
lzma_index_end(index, NULL);
return -1;
}
// Finally get the size
lzma_vli uSize = lzma_index_uncompressed_size(index);
lzma_index_end(index, NULL);
return (size_t) uSize;
}

关于c - 如何获取 LZMA2 文件 (.xz/liblzma) 的未压缩大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2171775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com