- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个解压缩 LZAM2
压缩数据的函数。我的灵感来自 this tutorial这对 LZMA
非常有效,我尝试将其改编为 LZMA2
。我成功地为 LZMA2
创建了压缩函数,但我没有成功创建解压缩函数。
这里是压缩函数:
static void Compress2Inc(std::vector<unsigned char> &outBuf,
const std::vector<unsigned char> &inBuf)
{
CLzma2EncHandle enc = Lzma2Enc_Create(&SzAllocForLzma, &SzAllocForLzma2);
assert(enc);
CLzma2EncProps props;
Lzma2EncProps_Init(&props);
props.lzmaProps.writeEndMark = 1; // 0 or 1
SRes res = Lzma2Enc_SetProps(enc, &props);
assert(res == SZ_OK);
unsigned propsSize = LZMA_PROPS_SIZE;
outBuf.resize(propsSize);
res = Lzma2Enc_WriteProperties(enc);
//cout << res;
//assert(res == SZ_OK && propsSize == LZMA_PROPS_SIZE);
VectorInStream inStream = { &VectorInStream_Read, &inBuf, 0 };
VectorOutStream outStream = { &VectorOutStream_Write, &outBuf };
res = Lzma2Enc_Encode(enc,
(ISeqOutStream*)&outStream, (ISeqInStream*)&inStream,
0);
assert(res == SZ_OK);
Lzma2Enc_Destroy(enc);
}
地点:
static void *AllocForLzma2(void *, size_t size) { return BigAlloc(size); }
static void FreeForLzma2(void *, void *address) { BigFree(address); }
static ISzAlloc SzAllocForLzma2 = { AllocForLzma2, FreeForLzma2 };
static void *AllocForLzma(void *, size_t size) { return MyAlloc(size); }
static void FreeForLzma(void *, void *address) { MyFree(address); }
static ISzAlloc SzAllocForLzma = { AllocForLzma, FreeForLzma };
typedef struct
{
ISeqInStream SeqInStream;
const std::vector<unsigned char> *Buf;
unsigned BufPos;
} VectorInStream;
SRes VectorInStream_Read(void *p, void *buf, size_t *size)
{
VectorInStream *ctx = (VectorInStream*)p;
*size = min(*size, ctx->Buf->size() - ctx->BufPos);
if (*size)
memcpy(buf, &(*ctx->Buf)[ctx->BufPos], *size);
ctx->BufPos += *size;
return SZ_OK;
}
typedef struct
{
ISeqOutStream SeqOutStream;
std::vector<unsigned char> *Buf;
} VectorOutStream;
size_t VectorOutStream_Write(void *p, const void *buf, size_t size)
{
VectorOutStream *ctx = (VectorOutStream*)p;
if (size)
{
unsigned oldSize = ctx->Buf->size();
ctx->Buf->resize(oldSize + size);
memcpy(&(*ctx->Buf)[oldSize], buf, size);
}
return size;
}
到目前为止,这是我对解压缩函数的了解,但是 Lzma2Dec_DecodeToBuf
函数返回错误代码 1
(SZ_ERROR_DATA
) 而我就是不能'在网络上找不到与此相关的任何信息。
static void Uncompress2Inc(std::vector<unsigned char> &outBuf,
const std::vector<unsigned char> &inBuf)
{
CLzma2Dec dec;
Lzma2Dec_Construct(&dec);
SRes res = Lzma2Dec_Allocate(&dec, outBuf.size(), &SzAllocForLzma);
assert(res == SZ_OK);
Lzma2Dec_Init(&dec);
outBuf.resize(UNCOMPRESSED_SIZE);
unsigned outPos = 0, inPos = LZMA_PROPS_SIZE;
ELzmaStatus status;
const unsigned BUF_SIZE = 10240;
while (outPos < outBuf.size())
{
unsigned destLen = min(BUF_SIZE, outBuf.size() - outPos);
unsigned srcLen = min(BUF_SIZE, inBuf.size() - inPos);
unsigned srcLenOld = srcLen, destLenOld = destLen;
res = Lzma2Dec_DecodeToBuf(&dec,
&outBuf[outPos], &destLen,
&inBuf[inPos], &srcLen,
(outPos + destLen == outBuf.size()) ? LZMA_FINISH_END : LZMA_FINISH_ANY,
&status);
assert(res == SZ_OK);
inPos += srcLen;
outPos += destLen;
if (status == LZMA_STATUS_FINISHED_WITH_MARK)
break;
}
Lzma2Dec_Free(&dec, &SzAllocForLzma);
outBuf.resize(outPos);
}
我正在使用从 here 下载的 Visual Studio 2008
和 LZMA SDK
.有人here有完全相同的问题,但我无法使用他的代码...
有没有人使用LZMA SDK
成功解压过LZMA2
压缩文件?
请帮忙!
最佳答案
临时解决方法是将 SRes res = Lzma2Dec_Allocate(&dec, outBuf.size(), &SzAllocForLzma);
替换为 SRes res = Lzma2Dec_Allocate(&dec, 8, &SzAllocForLzma);
在 Uncompress2Inc
函数中,其中 8
是一个魔数(Magic Number)...
然而这不是解决问题的正确方法...
第一个错误是 Lzma2Enc_WriteProperties
没有返回结果,而是一个属性字节,它必须用作 Uncompress2Inc
函数中 Lzma2Dec_Allocate 调用的第二个参数.结果,我们将魔数(Magic Number) 8
替换为属性字节,一切都按预期进行。
为了实现这一点,必须将 5 字节的 header 添加到将在解码函数中提取的编码数据。这是一个在 VS2008 中工作的例子(不是最完美的代码,但它工作......我稍后会回来,当我有时间时,有一个更好的例子):
void Lzma2Benchmark::compressChunk(std::vector<unsigned char> &outBuf, const std::vector<unsigned char> &inBuf)
{
//! \todo This is a temporary workaround, size needs to be added to the
m_uncompressedSize = inBuf.size();
std::cout << "Uncompressed size is: " << inBuf.size() << std::endl;
DWORD tickCountBeforeCompression = GetTickCount();
CLzma2EncHandle enc = Lzma2Enc_Create(&m_szAllocForLzma, &m_szAllocForLzma2);
assert(enc);
CLzma2EncProps props;
Lzma2EncProps_Init(&props);
props.lzmaProps.writeEndMark = 1; // 0 or 1
props.lzmaProps.level = 9;
props.lzmaProps.numThreads = 3;
//props.numTotalThreads = 2;
SRes res = Lzma2Enc_SetProps(enc, &props);
assert(res == SZ_OK);
// LZMA_PROPS_SIZE == 5 bytes
unsigned propsSize = LZMA_PROPS_SIZE;
outBuf.resize(propsSize);
// I think Lzma2Enc_WriteProperties returns the encoding properties in 1 Byte
Byte properties = Lzma2Enc_WriteProperties(enc);
//! \todo This is a temporary workaround
m_propByte = properties;
//! \todo Here m_propByte and m_uncompressedSize need to be added to outBuf's 5 byte header so simply add those 2 values to outBuf and start the encoding from there.
BenchmarkUtils::VectorInStream inStream = { &BenchmarkUtils::VectorInStream_Read, &inBuf, 0 };
BenchmarkUtils::VectorOutStream outStream = { &BenchmarkUtils::VectorOutStream_Write, &outBuf };
res = Lzma2Enc_Encode(enc,
(ISeqOutStream*)&outStream,
(ISeqInStream*)&inStream,
0);
std::cout << "Compress time is: " << GetTickCount() - tickCountBeforeCompression << " milliseconds.\n";
assert(res == SZ_OK);
Lzma2Enc_Destroy(enc);
std::cout << "Compressed size is: " << outBuf.size() << std::endl;
}
void Lzma2Benchmark::unCompressChunk(std::vector<unsigned char> &outBuf, const std::vector<unsigned char> &inBuf)
{
DWORD tickCountBeforeUncompression = GetTickCount();
CLzma2Dec dec;
Lzma2Dec_Construct(&dec);
//! \todo Heere the property size and the uncompressed size need to be extracted from inBuf, which is the compressed data.
// The second parameter is a temporary workaround.
SRes res = Lzma2Dec_Allocate(&dec, m_propByte/*8*/, &m_szAllocForLzma);
assert(res == SZ_OK);
Lzma2Dec_Init(&dec);
outBuf.resize(m_uncompressedSize);
unsigned outPos = 0, inPos = LZMA_PROPS_SIZE;
ELzmaStatus status;
const unsigned BUF_SIZE = 10240;
while(outPos < outBuf.size())
{
SizeT destLen = std::min(BUF_SIZE, outBuf.size() - outPos);
SizeT srcLen = std::min(BUF_SIZE, inBuf.size() - inPos);
SizeT srcLenOld = srcLen, destLenOld = destLen;
res = Lzma2Dec_DecodeToBuf(&dec,
&outBuf[outPos],
&destLen,
&inBuf[inPos],
&srcLen,
(outPos + destLen == outBuf.size()) ? LZMA_FINISH_END : LZMA_FINISH_ANY,
&status);
assert(res == SZ_OK);
inPos += srcLen;
outPos += destLen;
if(status == LZMA_STATUS_FINISHED_WITH_MARK)
{
break;
}
}
Lzma2Dec_Free(&dec, &m_szAllocForLzma);
outBuf.resize(outPos);
std::cout << "Uncompress time is: " << GetTickCount() - tickCountBeforeUncompression << " milliseconds.\n";
}
关于C++ LZMA SDK : Uncompress function for LZMA2 compressed file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21289985/
zlib中的deflate()和compress()函数之间有什么区别? 我浏览了在线示例,其中一些使用deflate,而另一些使用compress。 我应该如何决定在哪种情况下使用另一种情况? 最佳
这是我的config.rb preferred_syntax = :sass http_path = '/' css_dir = 'css' sass_dir = 'sass' images_dir
我正在查看 Oracle 的 OLTP 表压缩(11g 及以上)文档以及在线资源以查找语法并遇到两个不同的版本: COMPRESS FOR ALL OPERATIONS 和 COMPRESS FOR
我目前在 .NET 2.0 下使用 SharpZipLib,通过它我需要将单个文件压缩为单个压缩存档。为此,我目前正在使用以下内容: string tempFilePath = @"C:\Users\
本文整理了Java中org.apache.hadoop.io.compress.zlib.ZlibCompressor.compress()方法的一些代码示例,展示了ZlibCompressor.co
我从 Azure Synapse 收到此建议。 推荐详情我们检测到您可以通过拆分存储帐户中暂存的压缩文件来提高负载吞吐量。一个好的经验法则是将压缩文件拆分为 60 个或更多,以最大限度地提高负载的并行
这个问题继续讨论开始 here 。我发现 HTTP 响应正文无法被解码为 JSON 对象,因为后者的 deflate 压缩。现在我想知道如何用Golang进行解压。我将不胜感激任何能够显示我的代码中的
我刚开始为新雇主工作。对于我的上一个雇主,我们使用 LESS 并将其编译为 .css 文件,然后将其压缩为 .min.css 文件。对于我的新雇主,我们也使用 LESS。但是这里我们不仅编译了LESS
我在终端中使用 compress file.txt 压缩了一个文件并得到了(如预期的那样)file.txt.Z 当我将该文件传递给 Go 中的 ioutil.ReadFile 时, buf0, err
当我打开Android Studio时,Android Studio将从commons-compress-1.12.jar下载https://jcenter.bintray.com/org/apach
我收到此错误,但我不知道为什么突然遇到 django-pipeline 问题。 我正在 virtualenv 下运行该项目,我尝试使用所需的基本应用程序创建一个新项目,看看它是否可以修复它,但我总是收
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
对于压缩由 fasta 核苷酸序列组成的数据集,推荐的压缩算法是什么(.xz、tar.gz、tar.bz2 等)? 此类数据的推荐压缩机制是什么? 基于字典的压缩 基于自适应字典的压缩 基于LZW算法
我正在寻找一个支持解压期间随机访问的通用压缩库。我想将维基百科压缩成单一的压缩格式,同时我想从中解压/提取个别文章。 当然,我可以单独压缩每篇文章,但这不会给出太大的压缩率。我听说 LZO 压缩文件由
我想压缩一串位,然后我想解压缩它。任何机构都可以通过提及快速无损压缩和解压缩技术来帮助我,如果可能的话,它的编程实现可以帮助我。 最佳答案 如果您正在寻找速度,那么考虑像 LZ4 这样的快速压缩算法是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 4年前关闭。 Improve this qu
当我们压缩一个文件夹时,我们输入命令tar -cjf folder.tar.bz2 folder,它会将整个文件夹压缩到其中。 无论如何要压缩文件夹中的所有内容,但该文件夹不应出现在存档中? 示例 -
来自 Shannon's Source Coding Theorem我们知道压缩字符串的熵受原始字符串熵的限制,如下所示: H(X) <= L < H(X) + 1/N 其中 H(X) 是源字符串的熵
假设您有一个四字节整数,并且您想将其压缩为更少的字节。您可以压缩它,因为较小的值比较大的值更有可能(即,值的概率随其大小而降低)。您应用以下方案来生成 1、2、3 或 4 字节的结果: 请注意,在下面
是否有可能使用某种简单算法打包大文件,使我读取数据的速度比未压缩文件快(由于硬盘驱动器比未压缩速度慢)? 我需要什么样的压缩率?任何快速压缩算法都能做到吗? 最佳答案 是。当从硬盘上读取压缩系数为4的
我是一名优秀的程序员,十分优秀!