我使用python 2.7的请求模块将更大的数据块发布到我无法更改的服务中.由于数据主要是文本,因此数据量很大但压缩效果会很好.服务器将接受gzip或deflate-encoding,但是我不知道如何指示请求执行POST并自动正确编码数据.
是否有可用的最小示例,说明了这是如何实现的?
谷歌现在因为不那么适合移动设备而受到惩罚.因此,为了使事情变得更好,它建议我使用Gzip或Deflate压缩我的大量Javascript.我已经看到了一些关于堆栈溢出的旧建议,但没有任何开箱即用的东西,我试图搜索附加组件,但到目前为止似乎没有什么可以做到这一点.压缩或启用gzip最不痛苦和最强大的是什么?
以下是Google建议我做的事情:
启用压缩使用gzip或deflate压缩资源可以减少通过网络发送的字节数.为以下资源启用压缩,将传输大小减少420KiB(减少74%).
我正在使用Django,如果这更容易.
我需要使用gzip或deflate预压缩一些非常大的html/xml/json文件(大型数据转储).我从不想要提供未压缩的文件.它们是如此庞大和重复,以至于压缩可能会非常好地工作,虽然一些旧的浏览器不能支持解压缩,但我的典型客户不会使用它们(尽管如果我能产生某种'嘿你需要的那样会很好升级浏览器的消息)
我自动生成文件,我可以轻松生成.htaccess文件以与每种文件类型一起使用.基本上我想要的是一些总是在mod_gunzip版本.因为文件很大,并且因为我将重复提供它们,所以我需要一种方法,允许我在命令行上压缩一次,非常好.
我在这个网站上找到了一些关于如何使用gzip进行此操作的信息,但我想知道是否有人可以指导我如何使用deflate来做到这一点.奖励指向一个完整的答案,包括我的.htaccess文件应该是什么样子,以及我应该使用的命令行代码(GNU/Linux)来获得最佳压缩.答案的超级奖励积分还解决了如何向不兼容的浏览器发送"抱歉没有文件"消息.
如果我们可以创建一个"预压缩"标签来涵盖这样的问题,那将是很可爱的.
-FT
我有以下代码:
MemoryStream resultStream = new MemoryStream();
string users = ""//Really long string goes here
BinaryFormatter bFormatter = new BinaryFormatter();
using (MemoryStream assignedUsersStream = new MemoryStream())
{
bFormatter.Serialize(assignedUsersStream, users);
assignedUsersStream.Position = 0;
using (var compressionStream =
new DeflateStream(resultStream, CompressionLevel.Optimal))
{
assignedUsersStream.CopyTo(compressionStream);
Console.WriteLine("Compressed from {0} to {1} bytes.",
assignedUsersStream.Length.ToString(),
resultStream.Length.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
事情是resultStream永远是空的!
我在这做错了什么?
有没有理由在Ruby on Rails中默认没有启用Rack :: Deflater gzip?如果有的话,gzip对rails有什么缺点?
我正在编写一个压缩库作为一个小的项目,我已经足够了(我的库可以提取任何标准的gzip文件,以及生成兼容的(但肯定不是最佳的)gzip输出)是时候计算了一个有意义的块终止策略.目前,我只是在每32k输入(LZ77窗口大小)之后关闭块,因为它是通用的并且快速实现 - 现在我回过头来尝试实际提高压缩效率.
该放气的规格只有这样说的:"压缩机终止块时,它确定开始用新鲜的树一个新的模块将是有益的,或者当块大小填补了压缩机的缓冲块",这是不是所有的这很有帮助.
我通过SharpZipLib代码进行了排序(因为我认为这将是一个可读的开源实现),并发现它每16k字节的输出终止一个块,忽略输入.这很容易实现,但似乎必须有一些更具针对性的方法,特别是考虑到规范中的语言"确定用新鲜树开始新块将是有用的".
那么,是否有人对新战略或现有战略的例子有任何想法?
提前致谢!
我正在尝试实现zlib.h deflate和inflate函数来压缩和解压缩char数组(而不是文件).
我想知道以下语法是否正确?我错过了什么或定义错误的东西?
char a[50] = "Hello World!";
char b[50];
char c[50];
// deflate
// zlib struct
z_stream defstream;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;
defstream.avail_in = (uInt)sizeof(a); // size of input
defstream.next_in = (Bytef *)a; // input char array
defstream.avail_out = (uInt)sizeof(b); // size of output
defstream.next_out = (Bytef *)b; // output char array
deflateInit(&defstream, Z_DEFAULT_COMPRESSION);
deflate(&defstream, Z_FINISH);
deflateEnd(&defstream);
printf("Deflate:\n%lu\n%s\n", strlen(b), b);
// inflate
// zlib struct
z_stream infstream;
infstream.zalloc = Z_NULL;
infstream.zfree = Z_NULL;
infstream.opaque …Run Code Online (Sandbox Code Playgroud) 我想压缩一些数据,所以我遇到了DeflatorInputStream和DeflatorOutputStream类.但是,以下示例显示在使用这些类时,我似乎无法重建原始数据.
当我切换到ZipInputStream和ZipOutputStream它确实有效,但由于我本身不需要zip文件,我认为通用压缩会更好.主要是我有兴趣理解为什么这个例子不起作用.
//Create some "random" data
int bytesLength = 1024;
byte[] bytes = new byte[bytesLength];
for(int i = 0; i < bytesLength; i++) {
bytes[i] = (byte) (i % 10);
}
//Compress the data, and write it to somewhere (a byte array for this example)
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
DeflaterOutputStream outputStream = new DeflaterOutputStream(arrayOutputStream);
outputStream.write(bytes);
//Read and decompress the data
byte[] readBuffer = new byte[5000];
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray());
DeflaterInputStream inputStream = new DeflaterInputStream(arrayInputStream);
int read = inputStream.read(readBuffer); …Run Code Online (Sandbox Code Playgroud) 我试图使用这里描述的方法ASP.NET MVC Action Filter - Caching and Compression.起初,结果令人鼓舞,因为服务器确实开始发送GZip编码文件,但经过进一步测试,有时,在带有Html.RenderAction部分的页面中,该属性将被调用两次gziping allready gzip压缩页面.有没有人知道一个更稳定的方法来使用ASP.NET MVC 2提供压缩页面,或者任何关于如何修改代码的想法更通用?
public class CompressFilter : ActionFilterAttribute
{
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
Run Code Online (Sandbox Code Playgroud)
}
我目前正在为了学习目的而自己编写一个小的PNG图像I/O库.我的问题如下:
我创建了一个尺寸仅为2 x 2的小PNG,并在十六进制编辑器中打开它以研究其内容.这是我使用GIMP创建的图像,并以压缩"9"存储.
(请注意,这是原始2 x 2像素图像的放大图像;))

所以我猜没有压缩,这在内存中看起来像这样:
00 00 00 FF 00 00 00 00 FF 00 FF 00
Run Code Online (Sandbox Code Playgroud)
存储时没有alpha通道.
(为了清楚起见,我在这里只说了这个.我知道压缩,并且不希望在文件中看到这个字节模式).
我提取了IDAT块并剥离了块ID("IDAT")和尾随CRC值并得到了这个字节序列:
08 D7 05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06 0F FE 02 FE
Run Code Online (Sandbox Code Playgroud)
现在前两个字节08 D7包含有关编码块的信息.最后四个字节0F FE 02 FE必须是ADLER32校验和.
这最终让我得到以下字节:
05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06
Run Code Online (Sandbox Code Playgroud)
以二进制表示形式写的这些字节是:
0000 0101 1100 0001 0000 0001 0000 0001
0000 0000 …Run Code Online (Sandbox Code Playgroud)