我的包中有几个.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) 我想使用zlib来缩小一小块内存(<= 16 KiB).输出也存储在存储器块中.这里没有磁盘或数据库访问.
根据文档,我应该deflate()反复调用,直到整个输入被放气.在这两者之间,我必须增加输出所在的内存块的大小.
然而,这似乎不必要地复杂,甚至可能效率低下.据我所知输入的大小,我不能预先确定输出所需的最大大小,然后只需一次调用即可完成所有操作deflate()吗?
如果是这样,最大输出尺寸是多少?我假设一样的东西:输入的大小+一些字节开销
我有一个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)
请注意,第一个示例不是第二个示例的压缩版本,即某些值将有所不同,但整体结构应相同(一旦解压缩)。
谁能告诉我我如何解压缩?压缩后的参数来自请求主体,在某些情况下还包括文件数据。
感谢您的任何建议-最大
嗨,我正在尝试安装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) 因此,我的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兼容.
我编写了一个程序,该程序应该使用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) 我正在尝试使用crosstool-ng及其生成的编译器为ARM处理器交叉编译zlib arm-linux-gnueabihf-gcc。我将CC变量设置为使用交叉编译器以及AR和RANLIB,然后./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-ar,ARFLAGS=rcs从而修复了构建问题。但这对我来说是一个hack。这是配置脚本:
有人看到我运行configure命令的方式有问题吗?
我正在使用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'命名时,它与创建的文件的长度不同.我无法理解文件中额外字节的来源.
我正在使用一个字符串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) 我正在考虑使用哪种级别的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的数量级上,但是其他压缩因子的压缩率/范围也一样吗?