我需要在将大块文本保存到数据库之前压缩大块文本,并在客户端请求后将其解压缩.
当我使用Rails控制台插入新记录并立即查询新插入的记录时,我现在使用的方法似乎工作正常.即,我可以成功解压缩压缩的描述.
但是我无法解压缩description此日期之前添加的任何其他记录的压缩文件.对我来说真的很困惑,尤其是作为ROR世界的新手.
我MySQL用作数据库.
你能指点我正确的方向吗?请看下面的模型,以便更好地理解它.
require "base64"
class Video < ActiveRecord::Base
before_save :compress_description
def desc
unless description.blank?
return decompress(description)
end
end
private
def compress_description
unless description.blank?
self.description = compress(description)
end
end
def compress(text)
Base64.encode64(Zlib::Deflate.new(nil, -Zlib::MAX_WBITS).deflate(text, Zlib::FINISH))
end
def decompress(text)
Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(Base64.decode64(text))
end
end
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试在我的一个项目中使用zlib进行压缩.我看了一下基本的zlib教程,我对以下语句感到困惑:
CHUNK只是用于向zlib例程提供数据和从中提取数据的缓冲区大小.较大的缓冲区大小会更有效,尤其是对于inflate().如果内存可用,则应使用大约128K或256K字节的缓冲区大小.
#define CHUNK 16384
在我的情况下,我将始终在输出端有一个小缓冲区(大约80个字节),并将通过zlib从输入端连续输入非常小的数据(几个字节).这意味着我不会在任何一方都有更大的缓冲区,但我打算使用更小的缓冲区.
但是我不确定如何解释"更大的缓冲区大小会更有效".这是指编码效率还是时间/空间效率?
我必须解决这种情况的一个想法是添加一些缓冲层,这些缓冲层已从输入中累积并反复刷新到输出.然而,这意味着我将不得不累积数据并为我的数据添加更多级别的复制,这也会损害性能.
现在,如果效率只是指时间/空间效率,我可以衡量两种方法的影响,并决定使用一种方法.但是,如果实际编码可能受较小缓冲区大小的影响,则可能很难检测到.
有没有人有使用zlib和非常小的缓冲区的经验?
我想测试压缩和解压缩功能:compress()uncompresss()由ZLIB库提供; 编写了下面的代码来打开一个已经存在的文件,在while()循环中读取内部文件的内容已经存在,压缩部分写入单个文件,解压缩部分写入另一个文件,代码如下所示,已存在的文件大小(originalFile)约为78K,第一次进入while()循环压缩时返回值的解压缩为0,这样第一个条目成功,但第二个和下一个条目成功要输入,返回值是-5(根据官方文档,缓冲输出大小不包含内容),为什么?哪里错了?非常感谢你!
enter code here
#include <string>
#include <time.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include "zlib.h"
int main()
{
unsigned long int fileLength;
unsigned long int readLength;
unsigned long int compressBufLength;
unsigned long int uncompressLength;
unsigned long int offset;
unsigned char *readBuf = new unsigned char[512];//the readbuf of the exist file content
unsigned char *compressBuf = new unsigned char[512];//the compress buffer
unsigned char *uncompressBuf = new unsigned char[512];//the uncompress content buffer
FILE *originalFile = fopen("/lgw150/temp/src/lg4/original.lg4","a+");//the exist file
FILE *compressedFile …Run Code Online (Sandbox Code Playgroud) 我正在使用python zlib,我正在做以下事情:
zlib.compress)zlib.decompress)下载并读取和解压缩数据为字符串一切都运行正常,但是当我直接从S3下载文件并尝试使用标准zip程序打开它时,我收到错误.我注意到,而不是PK,文件的开头是:
xµ}ko$7’???¯¸??)$“??o³¶w¯1k{`
Run Code Online (Sandbox Code Playgroud)
我很灵活,不介意从zlib切换到另一个包,但它必须是pythonic(Heroku兼容)
谢谢!
我收到了这个错误
使用未声明的标识符'new'
在这行代码上
Byte* decompressedBytes = new Byte[COMPRESSION_BLOCK];
Run Code Online (Sandbox Code Playgroud)
这是我的方法,这行代码出现在.
// Returns the decompressed version if the zlib compressed input data or nil if there was an error
+ (NSData*) dataByDecompressingData:(NSData*)data{
Byte* bytes = (Byte*)[data bytes];
NSInteger len = [data length];
NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK];
Byte* decompressedBytes = new Byte[COMPRESSION_BLOCK];
z_stream stream;
int err;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = bytes;
err = inflateInit(&stream);
CHECK_ERR(err, @"inflateInit");
while (true) {
stream.avail_in = len - stream.total_in; …Run Code Online (Sandbox Code Playgroud) 我的问题是我的程序依赖于使用zlib的deflate()功能.
我首先初始化我z_stream,如下:
int setupGzipOutputStream(z_stream zStream) {
int zError;
zStream.zalloc = Z_NULL;
zStream.zfree = Z_NULL;
zStream.opaque = Z_NULL;
zError = deflateInit(&zStream, Z_COMPRESSION_LEVEL);
/* error handling code to test if zError != Z_OK... */
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下函数将数据写入我的z-stream:
int compressDataToGzipOutputStream(unsigned char *myData, z_stream zStream, Boolean flushZStreamFlag) {
int zError;
int zOutHave;
FILE *outFp = stdout;
unsigned char zBuffer[Z_BUFFER_MAX_LENGTH] = {0};
zStream.next_in = myData;
zStream.avail_in = strlen(myData); /* myData is a null-terminated string */
do {
zStream.avail_out = Z_BUFFER_MAX_LENGTH; …Run Code Online (Sandbox Code Playgroud) 我试图使用此处的代码从PDF文件中提取文本.该代码使用zlib库.
AFAICT程序的工作原理是在pdf文件中找到文本"stream"和"endstream"的出现之间的内存块.然后通过zlib对这些块进行充气.
代码在一个示例pdf文档上完美地工作,但在另一个上,zlib的inflate()函数每次调用时都会返回-3(Z_DATA_ERROR).
我注意到,失败的pdf文件被设置为在Adobe Reader中打开时没有"复制"选项.这可能与inflate()错误有关吗?...如果是,是否有解决问题的办法?
下面的代码片段 - 请参阅注释
//Now use zlib to inflate:
z_stream zstrm; ZeroMemory(&zstrm, sizeof(zstrm));
zstrm.avail_in = streamend - streamstart + 1;
zstrm.avail_out = outsize;
zstrm.next_in = (Bytef*)(buffer + streamstart);
zstrm.next_out = (Bytef*)output;
int rsti = inflateInit(&zstrm);
if (rsti == Z_OK)
{
int rst2 = inflate (&zstrm, Z_FINISH); // HERE IT RETURNS -3
if (rst2 >= 0)
{
//Ok, got something, extract the text:
size_t totout = zstrm.total_out;
ProcessOutput(fileo, output, …Run Code Online (Sandbox Code Playgroud) 我来使用一种奇怪的数据库文件格式.每个DB都带有两个文件:一个是"database.db",另一个是"database.key".
".db"文件始终以0x78 0x9C二进制头开头,而".key"始终在文件的随机部分中包含字符串"1.00 Peter's B Tree".
在线查看我发现标头0x78 0x9C可以引用压缩Zlib,但是没有找到任何方法来查看数据库的内容.
这里有没有人知道可以帮助我这种格式的东西?Thnaks :)
编辑1: ".db"文件似乎包含多个zlib放气流:签名0x78 0x9C不仅出现在文件的开头,而且出现在文件的不同部分.例如,这是我可以在一个文件中找到的一些流:
78 9C CB 63 40 07 33 76 5B 6A AF 78 DD 54 23 CE C9 90 C4 78 89 81 89 81 F1 22 86 9A ED 6A D7 44 F6 03 D5 B0 31 30 94 60 91 F6 D4 2A 76 3B 0C 94 E6 63 60 2C 51 B6 63 00 00 22 13 11 57
78 9C CB 63 40 07 …Run Code Online (Sandbox Code Playgroud) 使用 pako( https://github.com/nodeca/pako ) Pako在 javascript 中进行压缩的代码。它压缩字符串 't'
var compressedString = pako.gzip('t', {level: 4, to: 'string'}));
$.ajax('/decompress', {string: compressedString})
Run Code Online (Sandbox Code Playgroud)
/decompress 执行解压的代码
from cgi import parse_qs, escape
import json
import zlib
def application(environ, start_response):
status = '200 OK'
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
request_body = environ['wsgi.input'].read(request_body_size)
d = parse_qs(request_body)
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
inputString = d.get('string')[0]
# Use same wbits(=31) as used by pako
decompressed = zlib.decompress(inputString, 31);
return 'done'
Run Code Online (Sandbox Code Playgroud)
进行解压会引发以下错误。zlib.decompress 行发生错误。
错误:解压缩数据时出错 …
我很难尝试做一些我认为非常简单的事情(我一定不是第一个想做的人)。我在 Windows 7 上使用 Visual Studio 2017 来做一些 C 代码,我需要为 zip 充气/放气。
我搜索了一下,我找到了zlib。这似乎正是我搜索的内容:免费、酷版权、无专利,并在其他项目中广泛使用和测试。
所以,我开始下载最新版本(1.2.11 的 zip),然后我开始尝试“简单地”获取 DLL。
但是,文档指出为了编译“zlib1.dll”,我必须使用“./contrib/vstudio/vc..”,“..”是正确的 Visual Studio。但是我有 Visual Studio 2017,只有“vc9”到“vc14”,“vc14”是 Visual Studio 2015。
文档说我必须使用 Microsoft Visual C++ 2015,事实上,当我用 vs2017 强制打开时,我有完整性错误。
所以我尝试安装 MVC++ 2015,但它说我无法安装它,因为我已经安装了一些东西(VS2017)。
这么基本的东西真的没有办法实现,还是有我不知道的知识?