标签: gzipstream

为什么我的C#gzip会产生比Fiddler或PHP更大的文件?

如果我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)

c# gzip fiddler gzipstream

32
推荐指数
1
解决办法
1万
查看次数

如何在Node.js中一次将一个可读流传输到两个可写流中?

目标是:

  1. 创建文件读取流.
  2. 把它管到gzip(zlib.createGzip())
  3. 然后将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工作?

gzip zlib gzipstream node.js node.js-stream

30
推荐指数
2
解决办法
2万
查看次数

为什么C#内存流保留了这么多内存?

我们的软件通过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)

注意:如果相关,这是系统配置:

  • Windows XP 32位,
  • .NET 3.5 …

c# memory memory-management memorystream gzipstream

30
推荐指数
3
解决办法
7260
查看次数

在WebRequest中发送gzip压缩数据?

我有大量的数据(~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"适用于客户端提供的头文件.

c# gzip webrequest gzipstream

16
推荐指数
1
解决办法
1万
查看次数

GZipStream机器依赖

我在.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,但没有线索为什么.

这是怎么回事?

.net c# gzipstream .net-4.5

15
推荐指数
2
解决办法
1969
查看次数

如何验证网页是否被gzip压缩?

我计划配置weblogic的gzip servlet过滤器(使用weblogicx-gzip.jar)来gzip我的网页.

如何验证页面是否被发送到客户端gzip压缩?

gzip weblogic gzipstream

14
推荐指数
1
解决办法
7298
查看次数

如何读/写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()).

c++ gzip zlib gzipstream

13
推荐指数
3
解决办法
4万
查看次数

GZipStream和解压缩

我有应该进行压缩的代码:

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)

c# compression gzipstream

13
推荐指数
2
解决办法
5万
查看次数

.NET GZipStream压缩和解压缩

这个代码有什么问题.我总是得到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)

.net compression gzipstream

13
推荐指数
3
解决办法
3万
查看次数

.NET GZipStream解压缩生成空流

我正在尝试序列化和压缩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)

.net c# compression wpf gzipstream

10
推荐指数
2
解决办法
5370
查看次数