如果我GZip这个文字:
你好,世界
通过C#使用此代码:
Stream stream = new MemoryStream(Encoding.Default.GetBytes("Hello World"));
var compressedMemoryStream = new MemoryStream();
using (var gzipStream = new GZipStream(compressedMemoryStream, CompressionMode.Compress))
{
stream.CopyTo(gzipStream);
gzipStream.Close();
}
Run Code Online (Sandbox Code Playgroud)
结果流长133个字节
通过Fiddler Utilities.GzipCompress或此PHP页面运行相同的字符串,结果只有31个字节长.
在这两种情况下,输入都是11个字节,所以我认为PHP结果是正确的,但显然这意味着我无法从.NET内解压缩PHP zip,反之亦然.为什么.NET输出这么大?
实际上事实证明,尽管PHP和Fiddler的结果长度相同,但它们并不相同.我可以在.NET中解压缩PHP版本,但不能解压缩Fiddler版本.PHP页面解压缩这三个,所以看起来Fiddler和.NET的gzip实现之间可能存在不兼容性.
按照要求,我上传的三个输出到收存箱这里.
这些是这些文件的原始hexdump(不确定它们是否真的像这样使用,但我认为它表明fiddler和PHP版本之间的区别在于标题,而不是压缩数据本身):
小提琴手:
0000-0010: 1f 8b 08 00-c2 e6 ff 4f-00 ff f3 48-cd c9 c9 57 .......O ...H...W
0000-001f: 08 cf 2f ca-49 01 00 56-b1 17 4a 0b-00 00 00 ../.I..V ..J....
Run Code Online (Sandbox Code Playgroud)
PHP:
0000-0010: 1f 8b 08 00-00 00 00 00-00 03 …Run Code Online (Sandbox Code Playgroud) 目标是:
zlib.createGzip())然后将zlib输出的读取流传输到:
1)HTTP response对象
2)和可写文件流以保存gzip压缩输出.
现在我可以做到3.1:
var gzip = zlib.createGzip(),
sourceFileStream = fs.createReadStream(sourceFilePath),
targetFileStream = fs.createWriteStream(targetFilePath);
response.setHeader('Content-Encoding', 'gzip');
sourceFileStream.pipe(gzip).pipe(response);
Run Code Online (Sandbox Code Playgroud)
...工作正常,但我还需要将gzip压缩数据保存到文件中,这样我就不需要每次都重新压缩,并能够直接将gzip压缩数据作为响应流.
那么如何在Node中一次将一个可读流传输到两个可写流中?
将sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream);在节点0.8.4工作?
我们的软件通过a解压缩某些字节数据GZipStream,从a读取数据MemoryStream.这些数据以4KB的块解压缩并写入另一个MemoryStream.
我们已经意识到进程分配的内存远远高于实际的解压缩数据.
示例:具有2,425,536字节的压缩字节数组被解压缩为23,050,718字节.我们使用的内存分析器显示Method MemoryStream.set_Capacity(Int32 value)分配了67,104,936个字节.这是保留和实际写入内存之间的2.9倍.
注:MemoryStream.set_Capacity被称为从MemoryStream.EnsureCapacity它本身被称为MemoryStream.Write我们的功能.
为什么MemoryStream保留这么大的容量,即使它只附加4KB的块?
以下是解压缩数据的代码段:
private byte[] Decompress(byte[] data)
{
using (MemoryStream compressedStream = new MemoryStream(data))
using (GZipStream zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (MemoryStream resultStream = new MemoryStream())
{
byte[] buffer = new byte[4096];
int iCount = 0;
while ((iCount = zipStream.Read(buffer, 0, buffer.Length)) > 0)
{
resultStream.Write(buffer, 0, iCount);
}
return resultStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
注意:如果相关,这是系统配置:
我有大量的数据(~100k),我的C#app正在安装mod_gzip发送到我的Apache服务器.我正在尝试使用System.IO.Compression.GZipStream首先gzip数据.PHP接收原始的gzip压缩数据,因此Apache并没有像我期望的那样解压缩它.我错过了什么吗?
System.Net.WebRequest req = WebRequest.Create(this.Url);
req.Method = this.Method; // "post"
req.Timeout = this.Timeout;
req.ContentType = "application/x-www-form-urlencoded";
req.Headers.Add("Content-Encoding: gzip");
System.IO.Stream reqStream = req.GetRequestStream();
GZipStream gz = new GZipStream(reqStream, CompressionMode.Compress);
System.IO.StreamWriter sw = new System.IO.StreamWriter(gz, Encoding.ASCII);
sw.Write( large_amount_of_data );
sw.Close();
gz.Close();
reqStream.Close()
System.Net.WebResponse resp = req.GetResponse();
// (handle response...)
Run Code Online (Sandbox Code Playgroud)
我不完全确定"Content-Encoding:gzip"适用于客户端提供的头文件.
我在.NET 4.0中遇到了一些奇怪的机器/操作系统相关的GZipStream行为.这是相关代码:
public static string Compress(string input) {
using(var ms = new MemoryStream(Encoding.UTF8.GetBytes(input)))
using(var os = new MemoryStream()) {
using(var gz = new GZipStream(os,CompressionMode.Compress,true)) {
ms.CopyTo(gz);
}
return string.Join("",os.ToArray().Select(b=>b.ToString("X2")));
}
}
Run Code Online (Sandbox Code Playgroud)
运行压缩("freek")给了我
1F8B08000000000004004B2B4A4DCD06001E33909D05000000
Run Code Online (Sandbox Code Playgroud)
在Windows 7和
1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF040000FFFF1E33909D05000000
Run Code Online (Sandbox Code Playgroud)
在Windows Server 2008R2上.两者都是64位.我希望结果是一样的.
当我解压缩任一结果时,两台机器都给出正确的结果.我已经发现在W7 ms.Length == 25而在W2K8R2 ms.Length == 128,但没有线索为什么.
这是怎么回事?
我计划配置weblogic的gzip servlet过滤器(使用weblogicx-gzip.jar)来gzip我的网页.
如何验证页面是否被发送到客户端gzip压缩?
如何在C++中读/写gzip文件?
这里的iostream包装类看起来不错,这是一个简单的用法示例:
gz::igzstream in(filename);
std::string line;
while(std::getline(in, line)){
std::cout << line << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但我无法真正链接它(虽然我有/usr/lib/libz.a).一个简单的
g++ test-gzstream.cpp -lz
Run Code Online (Sandbox Code Playgroud)
不这样做(undefined reference to gz::gzstreambase::~gzstreambase()).
我有应该进行压缩的代码:
FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open);
FileStream fd = new FileStream("g:\\gj.zip", FileMode.Create);
GZipStream csStream = new GZipStream(fd, CompressionMode.Compress);
byte[] compressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
while (nRead > 0)
{
csStream.Write(compressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
}
fd.Close();
fs.Close();
Run Code Online (Sandbox Code Playgroud)
我认为确实如此,但我想解压缩上面压缩的内容.我这样想:
FileStream fd = new FileStream("g:\\gj.new", FileMode.Create);
FileStream fs = new FileStream("g:\\gj.zip", FileMode.Open);
GZipStream csStream = new GZipStream(fs, CompressionMode.Decompress);
byte[] decompressedBuffer = new byte[500]; …Run Code Online (Sandbox Code Playgroud) 这个代码有什么问题.我总是得到FALSE,这意味着在压缩之后,解压缩的数据与原始值不匹配.
public static bool Test()
{
string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] data = encoding.GetBytes(sample);
bool result = false;
//Compress
MemoryStream cmpStream;
cmpStream = new MemoryStream();
GZipStream hgs = new GZipStream(cmpStream, CompressionMode.Compress);
hgs.Write(data, 0, data.Length);
byte[] cmpData = cmpStream.ToArray();
MemoryStream decomStream;
decomStream = new MemoryStream(cmpData);
hgs = new GZipStream(decomStream, CompressionMode.Decompress);
hgs.Read(data, 0, data.Length);
string sampleOut = System.BitConverter.ToString(data);
result = String.Equals(sample, sampleOut) ;
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试序列化和压缩WPF FlowDocument,然后反向 - 解压缩字节数组并反序列化以重新创建FlowDocument - 使用.NET GZipStream类.我正在关注MSDN上描述的示例,我有以下测试程序:
var flowDocumentIn = new FlowDocument();
flowDocumentIn.Blocks.Add(new Paragraph(new Run("Hello")));
Debug.WriteLine("Compress");
byte[] compressedData;
using (var uncompressed = new MemoryStream())
{
XamlWriter.Save(flowDocumentIn, uncompressed);
uncompressed.Position = 0;
using (var compressed = new MemoryStream())
using (var compressor = new GZipStream(compressed, CompressionMode.Compress))
{
Debug.WriteLine(" uncompressed.Length: " + uncompressed.Length);
uncompressed.CopyTo(compressor);
Debug.WriteLine(" compressed.Length: " + compressed.Length);
compressedData = compressed.ToArray();
}
}
Debug.WriteLine("Decompress");
FlowDocument flowDocumentOut;
using (var compressed = new MemoryStream(compressedData))
using (var uncompressed = new MemoryStream())
using (var decompressor …Run Code Online (Sandbox Code Playgroud) gzipstream ×10
c# ×6
gzip ×5
.net ×3
compression ×3
zlib ×2
.net-4.5 ×1
c++ ×1
fiddler ×1
memory ×1
memorystream ×1
node.js ×1
weblogic ×1
webrequest ×1
wpf ×1