每当我看到一些使用GZip压缩的源包或二进制文件时,我想知道是否还有理由支持gz超过xz(不包括到2000年的时间旅行),LZMA压缩算法的节省是巨大的,并且解压缩的幅度不会比gzip的.
根据此链接如何使用.NET创建7-Zip存档?,WOPR告诉我们如何使用7z SDK(http://www.7-zip.org/sdk.html )使用LMZA(7z压缩算法)压缩文件
using SevenZip.Compression.LZMA;
private static void CompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();
using (FileStream input = new FileStream(inFile, FileMode.Open))
{
using (FileStream output = new FileStream(outFile, FileMode.Create))
{
coder.Code(input, output, -1, -1, null);
output.Flush();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何解压呢?
我尝试:
private static void DecompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();
using (FileStream input = new FileStream(inFile, FileMode.Open))
{
using (FileStream output = new FileStream(outFile, FileMode.Create))
{
coder.Code(input, output, input.Length, …Run Code Online (Sandbox Code Playgroud) 我发现7-zip很棒,我想在.net应用程序上使用它.我有一个10MB的文件(a.001),它需要:

2秒编码.
如果我能在c#上做同样的事情,那将会很好.我已经下载了http://www.7-zip.org/sdk.html LZMA SDK c#源代码.我基本上将CS目录复制到visual studio中的控制台应用程序中:

然后我编译和eveything编译顺利.所以在输出目录中我放置了a.00110MB大小的文件.关于我放置的源代码的主要方法:
[STAThread]
static int Main(string[] args)
{
// e stands for encode
args = "e a.001 output.7z".Split(' '); // added this line for debug
try
{
return Main2(args);
}
catch (Exception e)
{
Console.WriteLine("{0} Caught exception #1.", e);
// throw e;
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行控制台应用程序时,应用程序运行良好,我得到a.7z工作目录上的输出.问题是需要很长时间.执行大约需要15秒!我也试过/sf/answers/614314921/方法,这也需要很长时间.为什么它比实际程序慢10倍?
即使我设置只使用一个线程:

它仍然需要更少的时间(3秒对15):
可能是因为C#比汇编还是C慢?我注意到该算法执行了大量繁重的操作.例如,比较这两个代码块.他们都做同样的事情:
#include <time.h>
#include<stdio.h>
void main()
{
time_t now;
int i,j,k,x;
long …Run Code Online (Sandbox Code Playgroud) 我有一个程序(用C#编写)直接读取/写入数据(没有服务器的直接文件访问)到firebird数据库文件.为了更好的交换,我希望(un)在导入/导出时压缩它们,以便通过互联网进行更好的交换,而无需外部程序来(不)压缩它们.
我知道#ziplib支持Zip,GZip,Tar和BZip2.
你知道C#还有哪些免费的压缩库?是否有支持LZMA的.NET库,因此我可以读/写".7z"文件?
我需要动态地进行lzma压缩和解压缩.我在Qt中通过qnetworkmanager收到一个大文件,我需要在下载数据流时解压缩它.
当我收到部分数据流时,我需要将其解压缩,附加到文件,然后在此过程中释放任何已用内存.做这个的最好方式是什么?
现在我正在尝试使用xz-utils,纯c api,也许有人可以提出更好的方法吗?
以下代码基于此示例
UPD2:
extern "C" void *lz_alloc(void *opaque, size_t nmemb, size_t size)
{
void *p = NULL;
try{
p = new char [size];
}
catch(std::bad_alloc &ba)
{
p = NULL;
}
return p;
}
extern "C" void lz_free(void *opaque, void *ptr)
{
delete [] (char*)ptr;
}
QByteArray lzCompress(QByteArray data)
{
QByteArray arr;
lzma_check check = LZMA_CHECK_CRC64;
lzma_stream strm = LZMA_STREAM_INIT; /* alloc and init lzma_stream struct */
lzma_allocator al;
al.alloc = lz_alloc;
al.free = lz_free; …Run Code Online (Sandbox Code Playgroud) http://www.7-zip.org/sdk.html 这个网站提供了一个用于压缩/解压缩文件的LZMA SDK,我想试一试,但我迷路了.
有人有这方面的经验吗?还是教程?谢谢.
我正在提取macOS sierra更新包 - macOSUpd10.12.1.pkg使用以下命令到/ tmp/macosupd目录.
pkgutil --expand /Volumes/macOS\ Sierra\ Update/macOSUpd10.12.1.pkg /tmp/macosupd
Run Code Online (Sandbox Code Playgroud)
我可以看到以下包捆绑在metapackage中.
-rwxr-xr-x 1 Distribution
drwxr-xr-x 6 FirmwareUpdate.pkg
drwxr-xr-x 5 FullBundleUpdate.pkg
drwxr-xr-x 36 Resources
drwxr-xr-x 6 macOSUpd10.12.1.pkg
Run Code Online (Sandbox Code Playgroud)
我无法提取Payload文件的内容.例如,当我尝试提取macOSUpd10.12.1.pkg的Payload时,我收到以下错误消息:
用tar:
tar -xvf macOSUpd10.12.1.pkg/Payload
tar: Unrecognized archive format
tar: Error exit delayed from previous errors.
Run Code Online (Sandbox Code Playgroud)
与xar:
xar -xvf macOSUpd10.12.1.pkg/Payload
Error opening xar archive: macOSUpd10.12.1.pkg/Payload
Run Code Online (Sandbox Code Playgroud)
当我在有效负载文件上运行file命令时,我得到一条消息:
file macOSUpd10.12.1.pkg/Payload
macOSUpd10.12.1.pkg/Payload: data
Run Code Online (Sandbox Code Playgroud)
通过使用xxd命令查看Payload文件的初始位,我可以看到文件类型pbzx
xxd macOSUpd10.12.1.pkg/Payload
00000000: 7062 7a78 0000 0000 0100 0000 0000 0000 pbzx............
00000010: 0100 0000 0000 0000 0031 …Run Code Online (Sandbox Code Playgroud) 我正在尝试解压缩.xz文件,其中包含一些foders和文件.我没有看到使用lzma模块执行此操作的直接方法.这就是我所看到的解压缩方法:
In [1]: import lzma
In [2]: f = lzma.decompress("test.tar.xz")
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-2-3b08bf488f9d> in <module>()
----> 1 f = lzma.decompress("test.tar.xz")
error: unknown file format
Run Code Online (Sandbox Code Playgroud)
是否还有其他方法可以解压缩此文件,以便创建生成的文件夹?
我需要了解有关LZMA压缩算法的详细信息.我知道它的一般概念,但我需要一些例子来详细解释它.有人可以帮我获取更多信息吗?
谢谢.
lzma ×10
7zip ×5
compression ×4
c# ×3
xz ×2
algorithm ×1
c++ ×1
java ×1
macos ×1
macos-sierra ×1
performance ×1
python ×1
qt ×1
sdk ×1
zip ×1