标签: zlib

zlib iPhone - 文件开始变废话

我的包中有几个.tgz文件,我想要解压缩并写入文件.我有它的工作 - 有点.问题是写入的文件前面有512字节的垃圾数据,但除此之外,该文件已成功解压缩.

alt text http://pici.se/pictures/acbdwGCvX.gif

我不想要废话.如果它总是512字节,那么当然很容易跳过那些并写下其他的.但它总是这样吗?如果不知道为什么那些字节在那里,那么冒险做类似的事情.

    gzFile f = gzopen ([[[NSBundle mainBundle] pathForResource:file ofType:@"tgz"] cStringUsingEncoding:NSASCIIStringEncoding], [@"rb" cStringUsingEncoding:NSASCIIStringEncoding]); 
    unsigned int length = 1024*1024;
    void *buffer = malloc(length);
    NSMutableData *data = [NSMutableData new];

    while (true)
    {   
        int read = gzread(f, buffer, length);

        if (read > 0)
        {
            [data appendBytes:buffer length:read];
        }
        else if (read == 0)
            break;
        else if (read == -1)
        {
            throw [NSException exceptionWithName:@"Decompression failed" reason:@"read = -1" userInfo:nil];
        }
        else
        {
            throw [NSException exceptionWithName:@"Unexpected state from zlib" reason:@"read …
Run Code Online (Sandbox Code Playgroud)

compression iphone zlib

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

zlib:如何维度avail_out

我想使用zlib来缩小一小块内存(<= 16 KiB).输出也存储在存储器块中.这里没有磁盘或数据库访问.

根据文档,我应该deflate()反复调用,直到整个输入被放气.在这两者之间,我必须增加输出所在的内存块的大小.

然而,这似乎不必要地复杂,甚至可能效率低下.据我所知输入的大小,我不能预先确定输出所需的最大大小,然后只需一次调用即可完成所有操作deflate()吗?

如果是这样,最大输出尺寸是多少?我假设一样的东西:输入的大小+一些字节开销

c compression buffer zlib deflate

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

Rails:如何解压缩压缩的XML请求正文?

我有一个Rails 3网站,该网站从iPhone应用程序获取xml请求(包括文件提交)。iphone应用程序压缩它的xml请求的主体,像这样到达我的控制器(这是一个简单的请求,它仅更新几个详细信息而不发送任何文件):

params = {"\x1F\x8B\b\x00\x00\x00\x00\x00\x00\x035\xCAA\x0E\x83 \x10@\xD1\xD3\xE8\xD20\x02R\x17\xDD4\xBD\x87\x01\x9CZ\"H\x03CHo\xDF\xB2`\xFB\xDFO\xF8\x89\x89\x06\xF9\xA81\x9D/\x1F\xEB\x96IS\xC9\x83|\xDE\xF9\x98\xBA\xE2E\xE9\xBB\xD9X.j\xC2F"=>{"\xE8\xFD\xEF\xE4\x02\xB6\x00\x1C\x18\x13\x1C\xA4\xEC\x82A"=>nil}, "\xDF\x88\xA2\xCEt\xBA}\xAA\xCE{\xA7C\x1E\x04"=>nil, "\x1AN6\x86~gw\xB4\xD7\x00\x82\xE0r\xC1\x9D\x8B\xDB\xAC\xD6uF.\xCCb%\x03\x83\xA0\xD4\x0F~\xA0o\x1F\xAE\x00\x00"=>nil, "action"=>"update", "controller"=>"reports", "id"=>"65", "format"=>"xml"}
Run Code Online (Sandbox Code Playgroud)

它看起来应该像这样:

params = {"report"=>{"workflow_status"=>"-1", "entry_count"=>"0"}, "auth"=>{"time"=>"1310044269", "email"=>"fake@fakedomainzzz.com", "sig"=>"686062dbc27ef49baa69be77a0ba6362"}, "action"=>"update", "controller"=>"reports", "id"=>"65", "format"=>"xml"}
Run Code Online (Sandbox Code Playgroud)

请注意,第一个示例不是第二个示例的压缩版本,即某些值将有所不同,但整体结构应相同(一旦解压缩)。

谁能告诉我我如何解压缩?压缩后的参数来自请求主体,在某些情况下还包括文件数据。

感谢您的任何建议-最大

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

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

链接到库的"本地"版本

嗨,我正在尝试安装zlib的newversion,我没有root权限,所以我只是在本地安装它.系统安装是1.2.3,我正在尝试使用1.2.5

我编译得像

g++ -g myProg.cpp myOs.o -lpthread -IzlibInc/  -LzlibLib/ -lz  -o myProg
Run Code Online (Sandbox Code Playgroud)

使用ldd它说

    ldd myProg
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c15800000)
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003c15c00000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c17400000)
libm.so.6 => /lib64/libm.so.6 (0x0000003c15400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c17000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003c14c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003c14800000)
Run Code Online (Sandbox Code Playgroud)

所以它没有正确链接.

谢谢

/////////////////////////////////////////////
Run Code Online (Sandbox Code Playgroud)

更新

我有两个名为zlibInc的文件夹,zlibLib包含头文件和共享对象文件.

ls zlibLib/
libz.a  libz.so  libz.so.1  libz.so.1.2.5  pkgconfig
ls zlibInc/
zconf.h  zlib.h
Run Code Online (Sandbox Code Playgroud)

我的源代码是

cat zlibTest.cpp
#include <cstdio>
#include <zlib.h>

int main(){
  fprintf(stderr,"%s\n",ZLIB_VERSION);
  int *a=new int[10];

  gzread(stdin,a,5);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的编译命令行是

g++ zlibTest.cpp   -I zlibInc/ -L …
Run Code Online (Sandbox Code Playgroud)

linker g++ zlib

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

Java中的gzinflate

因此,我的Java应用程序显示了一些使用PHP的gzdeflate()生成的数据.现在我正试图用Java来扩充这些数据.这是我到目前为止所得到的:

InflaterInputStream inflInstream = new InflaterInputStream(new ByteArrayInputStream(inputData.getBytes() ), new Inflater());

byte bytes[] = new byte[1024];
while (true) {
    int length = inflInstream.read(bytes, 0, 1024);
    if (length == -1)  break;

    System.out.write(bytes, 0, length);
}
Run Code Online (Sandbox Code Playgroud)

'inputData'是一个包含放气数据的String.

问题是:.read方法抛出异常:

java.util.zip.ZipException:标头检查不正确

关于这个主题的其他网站只是将我重定向到Inflater类的文档,但显然我不知道如何使用它来与PHP兼容.

php java interop zlib

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

使用zlib压缩/解压缩char数组,缺少一些字符

我编写了一个程序,该程序应该使用zlib函数compress()和uncompress()进行压缩,然后解压缩字符串,它的编译效果还不错,但是由于某种原因,当我启动它时,未压缩字符串中的一些符号丢失了-我得到的是“一些”,然后是一些系统符号。有人可以帮我在这里找到错误吗?

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "zlib.h"
int main()
{
const char *istream = "some foo";
ulong destLen = strlen(istream);
char* ostream = malloc(2 * strlen(istream));
int res = compress(ostream, &destLen, istream, destLen + 1);


const char *i2stream = ostream;
char* o2stream = malloc(4 * strlen(istream));
ulong destLen2 = strlen(i2stream);
int des = uncompress(o2stream, &destLen2, i2stream, destLen2);
printf("%s", o2stream);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

c compression zlib

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

zlib构建无法与交叉编译器正确配置,会忽略AR?

我正在尝试使用crosstool-ng及其生成的编译器为ARM处理器交叉编译zlib arm-linux-gnueabihf-gcc。我将CC变量设置为使用交叉编译器以及ARRANLIB,然后./configure按如下所示运行它们:

CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib LDSHARED="arm-linux-gnueabihf-gcc -shared -Wl,-soname,libz.so.1" ./configure --shared --prefix=/usr
Run Code Online (Sandbox Code Playgroud)

问题是它吐出了一个Makefile没有AR设置的变量,而是AR设置为libtool,该变量用于我的本机Mac计算机。这是Makefile设置的内容:

AR=libtool
ARFLAGS=-o
RANLIB=ranlib
Run Code Online (Sandbox Code Playgroud)

我可以手动编辑Makefile并进行更改AR=arm-linux-gnueabihf-arARFLAGS=rcs从而修复了构建问题。但这对我来说是一个hack。这是配置脚本:

http://pastebin.com/trmJbPKb

有人看到我运行configure命令的方式有问题吗?

makefile zlib configure cross-compiling

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

使用c ++ io的奇怪行为

我正在使用zlib压缩我正在制作的游戏的数据.这是我一直在使用的代码

#include <SFML/Graphics.hpp>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include "zlib.h"
#include "zconf.h"

using namespace std;

void compress(Bytef* toWrite, int bufferSize, char* filename)
{
    uLongf comprLen = compressBound(bufferSize);
    Bytef* data = new Bytef[comprLen];
    compress(data, &comprLen, &toWrite[0], bufferSize);
    ofstream file(filename);
    file.write((char*) data, comprLen);
    file.close();
    cout<<comprLen;
}

int main()
{
    const int X_BLOCKS = 1700;
    const int Y_BLOCKS = 19;
    int bufferSize = X_BLOCKS * Y_BLOCKS;
    Bytef world[X_BLOCKS][Y_BLOCKS];
    //fill world with integer values
    compress(&world[0][0], bufferSize, "Level.lvl");
    while(2);
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

现在我希望程序能够简单地压缩数组世界并将其保存到文件中.但是我发现了一种奇怪的行为.当我为'comprLen'命名时,它与创建的文件的长度不同.我无法理解文件中额外字节的来源.

c++ io zlib

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

如何在json中转储压缩字符串?

我正在使用一个字符串zlib,将其存储在字典中并创建字典的md5哈希值.但是我收到了错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c in position 1: invalid start byte
Run Code Online (Sandbox Code Playgroud)

代码是:

data['extras'] = zlib.compress("My string".encode("utf-8"))  //The string is very large that\'s why it\'s needed to be compressed to save up memory 
checkup['hash'] = hashlib.md5(json.dumps(dict(data), sort_keys=True)).hexdigest()
Run Code Online (Sandbox Code Playgroud)

字典是这样的:

{'extras':'x\x9cK\x04\x00\x00b\x00b'}
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我如何在JSON中转储这个字典/字符串?

这个字符串是一个长json.就像是:

{
    "listing": {
            "policies": null,
            "policy_explanation": "Some Text",
            "policy_name": "Flexi3",
            "updated": "7 weeks ago",
            "city": "Bengaluru",
            "country": "India",
             .
             .
             .   
}
Run Code Online (Sandbox Code Playgroud)

python compression json dictionary zlib

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

不同zlib压缩级别的压缩率

我正在考虑使用哪种级别的zlib压缩,并且对可以在zlib命令中指定的不同压缩级别的不同压缩率感到好奇。该ZLIB手册具有用于指定的压缩级别以下常量:

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
Run Code Online (Sandbox Code Playgroud)

显然,数量越少意味着压缩和放缩的延迟时间越短,但代价是压缩文件较少,而数量越多,压缩效果越好,而代价则是等待时间更长。

我的问题是,对于不同的压缩级别,可以预期的压缩率是多少?这个zlib网页说,在最大压缩的情况下,更典型的zlib压缩率在2:1到5:1的数量级上,但是其他压缩因子的压缩率/范围也一样吗?

compression zlib

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