标签: zlib

Ruby on Rails:解压缩(Zlib :: Deflate)在一定时间后不起作用

我需要在将大块文本保存到数据库之前压缩大块文本,并在客户端请求后将其解压缩.

当我使用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)

ruby mysql ruby-on-rails zlib ruby-on-rails-3

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

zlib和缓冲区大小

我目前正在尝试在我的一个项目中使用zlib进行压缩.我看了一下基本的zlib教程,我对以下语句感到困惑:

CHUNK只是用于向zlib例程提供数据和从中提取数据的缓冲区大小.较大的缓冲区大小会更有效,尤其是对于inflate().如果内存可用,则应使用大约128K或256K字节的缓冲区大小.

#define CHUNK 16384

在我的情况下,我将始终在输出端有一个小缓冲区(大约80个字节),并将通过zlib从输入端连续输入非常小的数据(几个字节).这意味着我不会在任何一方都有更大的缓冲区,但我打算使用更小的缓冲区.

但是我不确定如何解释"更大的缓冲区大小会更有效".这是指编码效率还是时间/空间效率?

我必须解决这种情况的一个想法是添加一些缓冲层,这些缓冲层已从输入中累积并反复刷新到输出.然而,这意味着我将不得不累积数据并为我的数据添加更多级别的复制,这也会损害性能.

现在,如果效率只是指时间/空间效率,我可以衡量两种方法的影响,并决定使用一种方法.但是,如果实际编码可能受较小缓冲区大小的影响,则可能很难检测到.

有没有人有使用zlib和非常小的缓冲区的经验?

zlib buffering

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

在linux上,使用ZLIB的compress()和uncompress()函数,它有时会返回Z_BUFFER_ERROR

我想测试压缩和解压缩功能: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)

c linux zlib

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

zlib不以标准zip格式压缩

我正在使用python zlib,我正在做以下事情:

  1. 压缩内存中的大字符串(zlib.compress)
  2. 上传到S3
  3. 从S3(zlib.decompress)下载并读取和解压缩数据为字符串

一切都运行正常,但是当我直接从S3下载文件并尝试使用标准zip程序打开它时,我收到错误.我注意到,而不是PK,文件的开头是:

xµ}ko$7’???¯¸??)$“??o³¶w¯1k{`
Run Code Online (Sandbox Code Playgroud)

我很灵活,不介意从zlib切换到另一个包,但它必须是pythonic(Heroku兼容)

谢谢!

python compression zlib

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

Objective-C警告,使用未声明的标识符'new'

我收到了这个错误

使用未声明的标识符'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)

byte zlib nsdata ios

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

为什么zlib deflate()挂?

我的问题是我的程序依赖于使用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)

c gdb zlib stream deflate

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

从PDF中提取文本

我试图使用此处的代码从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)

c++ pdf zlib visual-studio-2008

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

带有78 9C标头的数据库文件?

我来使用一种奇怪的数据库文件格式.每个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)

database binary b-tree zlib

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

用pako(javascript中的zlib)压缩,用zlib(python)解压不起作用

使用 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 行发生错误。

错误:解压缩数据时出错 …

javascript python unicode zlib utf-8

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

如何在 Visual Studio 2017 上将 zlib 编译成 DLL?

我很难尝试做一些我认为非常简单的事情(我一定不是第一个想做的人)。我在 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)。

这么基本的东西真的没有办法实现,还是有我不知道的知识?

c zlib visual-studio-2017

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