标签: zlib

取消Python 2.5中的数据,在Python 3.1中,然后用zlib解压缩

在Python 2.5中,我使用以下代码存储数据:

def GLWriter(file_name, string):
   import cPickle
   import zlib
   data = zlib.compress(str(string))
   file = open(file_name, 'w')
   cPickle.dump(data, file)
Run Code Online (Sandbox Code Playgroud)

它工作正常,我能够通过反向执行该过程来读取数据.它不需要是安全的,只是人眼无法读取的东西.如果我将"test"放入其中然后打开它创建的文件,它看起来像这样:

S'x\x9c+I-.\x01\x00\x04]\x01\xc1'
p1
.
Run Code Online (Sandbox Code Playgroud)

由于各种原因,我们现在被迫使用Python 3.1,我们需要编写可以读取这些数据文件的代码.

Pickle不再接受字符串输入,所以我必须用"rb"打开文件.当我这样做并尝试使用pickle.load(文件)打开它时,我收到此错误:

File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
   encoding=encoding, errors=errors).load()
UnicodeDecodingError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我发现我可能无法在pickle中打开文件,我开始做一些研究,发现pickle只是在zlib生成的主要数据块的每一侧包含几个字符.然后我尝试将其修剪为zlibs输出并将其放入zlib.decompress.我的问题是它读取文件并将"\ x04"之类的内容解释为四个字符而不是一个字符.很多测试和搜索后来我找不到一种方法来使pickle加载文件,或让python识别这些代码所以我可以通过zlib.

所以我的问题是:如何使用Python3.1恢复原始数据?

我很乐意让我的客户安装Python2.5并手动完成,但这是不可能的.

非常感谢你的协助!

python zlib pickle

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

使用gzip_decompressor()的boost :: filtering_streambuf,如何从文件中逐行访问

我写了一个Logparser应用程序,现在我想实现.gz文件的解压缩.我尝试使用boost :: iostreams和zlib这似乎有效,但我不知道如何处理从压缩文件中获得的输入.

这是我做的:

input.open(p.source_at(i).c_str(), ios_base::in | ios_base::binary);
boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::gzip_decompressor());
in.push(input);
boost::iostreams::copy(in, cout);
Run Code Online (Sandbox Code Playgroud)

如果我的源文件的.gz结尾,则运行此代码.最后一行将解压缩的文件流正确输出到cout.

但是如何从解压缩文件中逐行获取?我的程序使用getline(输入,传输)来读取输入流中的行(如果它没有被压缩).

现在我想以相同的方式从解压缩文件中读取,但是如何从中获取新行?

这个加速计算对我没什么帮助.

提前致谢!

iostream zlib boost-iostreams

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

在C中放气和膨胀(zlib.h)

我正在尝试实现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)

c compression zlib deflate

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

如何链接zlib库

嗨,我正在使用boost和zlib过滤器来压缩和解压缩数据.在boost页面的指令中,它说如果.cpp文件依赖于外部库,你必须从源代码构建它或链接到预构建的二进制文件.

我使用mac端口安装boost和zlib.我将boost libarary包含为-I/opt/local/include

我的代码:

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

int main() 
{
    using namespace std;

    ifstream file("hello.z", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(zlib_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何链接预建的zlib外部库?它给了我这个编译问题:

mpic++ -o local ods_v2.0.cpp -I/opt/local/include
Undefined symbols for architecture x86_64:
  "boost::iostreams::zlib_error::check(int)", referenced from:
      long boost::iostreams::symmetric_filter<boost::iostreams::detail::zlib_decompressor_impl<std::allocator<char> >, std::allocator<char> >::write<boost::iostreams::detail::linked_streambuf<char, std::char_traits<char> > >(boost::iostreams::detail::linked_streambuf<char, std::char_traits<char> >&, char const*, long) in ods_v2-DjDcji.o
      void boost::iostreams::symmetric_filter<boost::iostreams::detail::zlib_decompressor_impl<std::allocator<char> >, std::allocator<char> >::close<boost::iostreams::detail::linked_streambuf<char, std::char_traits<char> > >(boost::iostreams::detail::linked_streambuf<char, std::char_traits<char> >&, std::_Ios_Openmode) in ods_v2-DjDcji.o
      void boost::iostreams::symmetric_filter<boost::iostreams::detail::zlib_decompressor_impl<std::allocator<char> >, std::allocator<char> >::close<boost::iostreams::non_blocking_adapter<boost::iostreams::detail::linked_streambuf<char, std::char_traits<char> …
Run Code Online (Sandbox Code Playgroud)

c++ compression boost zlib

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

在现有Qt项目中从源构建第三方库

我的项目需要zlib在所有目标计算机上都没有的版本,所以我想zlib在我的项目中从源代码构建.然后,当make我的项目,它应该首先构建,zlib以便它可以链接到编译我的项目时.

一个复杂因素是zlib需要configure在运行之前make运行.

我甚至不确定从哪里开始.Qt Creator是否内置了导入第三方库源代码的功能,或者我是否需要编写自定义.pro文件?

我尝试右键单击我的项目时出现的"添加库..."菜单,但它无法识别库 - 可能是因为没有.pro文件存在.我还尝试.pro通过File - > New Project - > Import Existing Project 创建一个文件,它可以编译zlib一次configure已运行,但它仍然不生成.pro文件.

我认为也许子目录可能有用,但我不确定在这种情况下这是否是正确的路线,即使它是我不确定我是否可以自动创建必要的.pro文件,或者我必须创建我自己.

鉴于第三方库的源代码zlib,如何将其集成到现有的Qt项目中,以便我可以从源代码编译库,并在我的项目中使用它?

c++ qt qmake zlib qt-creator

9
推荐指数
2
解决办法
5124
查看次数

JavaScript Zlib解压缩

我正在尝试解压缩zlib的XML,如下所示:https://drive.google.com/file/d/0B52P0MZLTdw8ZzQwQzVpZGZVZWc

上传到在线解压缩服务的工作,例如:http://i-tools.org/gzip

在PHP中,我使用此代码并且工作正常,我得到XML字符串:

$raw = file_get_contents("file_here");
$uncompressed = zlib_decode($raw);
Run Code Online (Sandbox Code Playgroud)

但是,我想在JavaScript中执行此操作.

  • 该应用是客户端Chrome扩展程序,它使用chrome.devtools.network从网络日志中读取
  • 读取二进制响应.顶部的Google云端硬盘链接示例
  • JS需要将该响应解压缩到其原始XML,然后解析为对象

我唯一的问题是zlib解压缩部分.

截至最新更新,解压缩库工作但解压缩不起作用.请跳至底部的更新9月16日.


我已经尝试了几个JavaScript库,仍然无法使其工作:

Pako:https://github.com/nodeca/pako

unpack()代码:https://codereview.stackexchange.com/questions/3569/pack-and-unpack-bytes-to-strings

function unpack(str) {
    var bytes = [];
    for(var i = 0, n = str.length; i < n; i++) {
        var char = str.charCodeAt(i);
        bytes.push(char >>> 8, char & 0xFF);
    }
    return bytes;
}

$.get("file_here", function(response){
    var charData    = unpack(response);
    var binData     = new Uint8Array(charData);
    var data        = …
Run Code Online (Sandbox Code Playgroud)

javascript jquery bytearray zlib google-chrome-extension

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

使用python解压缩.gz文件的一部分

所以这就是问题所在.我有sample.gz文件,大小约为60KB.我想解压缩此文件的前2000个字节.我正在运行CRC校验失败错误,我猜因为gzip CRC字段出现在文件的末尾,它需要整个gzip文件进行解压缩.有办法解决这个问题吗?我不关心CRC检查.即使我因CRC错误而无法解压缩,也没关系.有没有办法绕过这个并解压缩部分.gz文件?

我到目前为止的代码是

import gzip
import time
import StringIO

file = open('sample.gz', 'rb')
mybuf = MyBuffer(file)
mybuf = StringIO.StringIO(file.read(2000))
f = gzip.GzipFile(fileobj=mybuf)
data = f.read()
print data
Run Code Online (Sandbox Code Playgroud)

遇到的错误是

File "gunzip.py", line 27, in ?
    data = f.read()
File "/usr/local/lib/python2.4/gzip.py", line 218, in read
  self._read(readsize)
File "/usr/local/lib/python2.4/gzip.py", line 273, in _read
  self._read_eof()
File "/usr/local/lib/python2.4/gzip.py", line 309, in _read_eof
  raise IOError, "CRC check failed"
IOError: CRC check failed
Run Code Online (Sandbox Code Playgroud)

还有什么方法可以使用zlib模块执行此操作并忽略gzip标头?

python gzip zlib

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

boost :: iostream zlib将多个文件压缩到一个存档中

我在将一堆文件打包到一个档案中时遇到了麻烦.这个主题的提升文档是非常有限的,我现在在网上搜索了几个小时,但我找不到解决方案.

到目前为止我有什么:

boost::filesystem::ofstream ofsArchive("some.zip");
boost::iostreams::filtering_ostreambuf outFilter;
boost::iostreams::zlib_params zparam(boost::iostreams::zlib::default_compression);

try
{
    // set up the filter
    outFilter.strict_sync();
    outFilter.push(boost::iostreams::zlib_compressor(zparam));
    outFilter.push(ofsArchive);


    for(each object of some kind)
    {
        // create a binary serialized file
        boost::filesystem::ofstream ofs(filename, std::ios_base::binary); 
        boost::archive::binary_oarchive bin_oa( ofs ); 
        bin_oa << crazyObject;

        // here's where i'm stuck. how to add multiple files to the "some.zip"?
        boost::iostreams::copy(ofs, outputArchive);
    }
}
catch(boost::iostreams::zlib_error& e){...}
Run Code Online (Sandbox Code Playgroud)

如何将文件添加到zip存档?提供的方法显然不起作用,我只是在文档或头文件中找不到任何关于主题的内容

c++ compression serialization boost zlib

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

在Windows 8上解压缩存档

我以前使用MiniZip(zlib包装器)来解压缩档案.MiniZip不能用于Metro应用程序,因为它在"iowin32.c"中使用了弃用的API - CreateFile()和SetFilePointer().

我认为这将是一个简单的修复,并创建"iowinrt.c"与CreateFile()和SetFilePointer()替换为CreateFile2()和SetFilePointerEx().虽然这样我获得了一个只使用经过批准的Win8 API的MiniZip版本,但它仍然没用 - 我忘记了沙盒.如果我使用FileOpenPicker()选择一个文件并将其路径传递给我修改过的MiniZip,我仍然无法打开它 - CreateFile2()将因"访问被拒绝"而失败.信息.

所以看起来旧的C API用于文件访问,如果现在几乎无用; 我的理解是,为了解决这个问题,我需要使用新的异步文件访问在C++/CX中重新实现我的"iowinrt".还有其他选择吗?我想我在某处看到WinRT确实具有压缩/解压缩功能,但它只适用于单个文件,而不适用于存档.

我需要它在内存中工作的附加要求.

有一会儿,我以为我有一个通过.NET Framework 4.5的解决方案:

  1. 我发现了这条关于如何创建可以在C++/CX中使用的.NET类的信息:http: //social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3ff383d0-0c9f-4a30- 8987-ff2b23957f01

  2. .NET Framework 4.5在System.IO.Compression中包含ZipArchive和ZipArchiveEntry类:http: //msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx# Y0 http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry%28v=vs.110%29.aspx#Y0

我以为我可以使用WinMD输出类型创建C#Metro类库,公开ZipArchive和ZipArchiveEntry,然后在我的C++/CX项目中使用它.但是,即使它起作用,也不会在内存中起作用; ZipArchive和ZipArchiveEntry似乎只适用于文件.

zip zlib microsoft-metro c++-cx

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

如何在zlib CRC32中正确使用无进位乘法组件(PCLMULQDQ)?

我最近一直在使用CloudFlare优化的zlib,结果非常令人印象深刻.

不幸的是,他们似乎已经假设zlib的开发被放弃了,他们的分叉也就此消失了.我最终能够手动将他们的更改改为当前的zlib开发分支,尽管这是一个真正的痛苦.

无论如何,我还没有能够利用CloudFlare代码中的一个主要优化,即使用新的(Haswell和后来的,我相信)英特尔处理器中包含的PCLMULQDQ无进位乘法指令实现快速CRC32代码,因为:

  1. 我在Mac上,并没有clang集成汇编程序或Apple的古代GAS都不了解所用的新GAS助记符,以及

  2. 代码从Linux内核中取出并且是GPL2,这使得整个库GPL2,从而基本上使它对我的目的无用.

所以我做了一些狩猎,几个小时之后我偶然发现了一些Apple在他们的bzip2中使用的代码:arm64x86_64的手写,矢量化CRC32实现.

奇怪的是,x86_64程序集的注释(仅)在arm64源代码中,但它似乎表明此代码可以与zlib一起使用:

This function SHOULD NOT be called directly. It should be called in a wrapper
function (such as crc32_little in crc32.c) that 1st align an input buffer to 16-byte (update crc along the way),
and make sure that len is at least 16 and SHOULD be a multiple of 16.
Run Code Online (Sandbox Code Playgroud)

但不幸的是,经过几次尝试,此时我似乎有点过头了.而且我不确定如何真正做到这一点.所以我希望有人能告诉我如何/在哪里调用所提供的功能.

(如果有一种方法可以在运行时检测到必要的功能,并且如果硬件功能不可用则可以回退到软件实现,这也是很棒的,所以我不必分发多个二进制文件. ,至少,如果有人可以帮助我了解如何让库正确使用基于Apple PCLMULQDQ的CRC32,那么无论如何都会有很长的路要走.)

c assembly crc32 zlib mathematical-optimization

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