我正在尝试几个小时来在C中实现PHP gzinflate()的行为.在PHP中它只是:gzinflate($ str); 在Python中它是:import zlib ... return zlib.decompress(decoding_data,-15)...但我只是无法在C中实现它.任何人都可以帮助我吗?我真的被困了..我试图用Zlib做一些事但它没有用..有人有点意见吗?
提前致谢,
尼莫
我有代码,我有压缩数据,我需要解压缩它.我正在使用zlib这样做:
#include <zlib.h>
Run Code Online (Sandbox Code Playgroud)
在我的.cpp文件中.现在,当我编译它时,我得到错误:未定义的引用`uncompress_gzip'
是的,我需要链接一些lib?
谢谢,sg
发现这个:https: //stackoverflow.com/a/11373078/530599 - 很棒,但是
怎么样 stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_*
寻找另一种解压缩数据的方法.
$fp = fopen($src, 'rb');
$to = fopen($output, 'wb');
// some filtering here?
stream_copy_to_stream($fp, $to);
fclose($fp);
fclose($to);
Run Code Online (Sandbox Code Playgroud)
$src一些网址在哪里http://.../file.gz例如200+ Mb :)
添加了有效的测试代码,但分为两步:
<?php
$src = 'http://is.auto.ru/catalog/catalog.xml.gz';
$fp = fopen($src, 'rb');
$to = fopen(dirname(__FILE__) . '/output.txt.gz', 'wb');
stream_copy_to_stream($fp, $to);
fclose($fp);
fclose($to);
copy('compress.zlib://' . dirname(__FILE__) . '/output.txt.gz', dirname(__FILE__) . '/output.txt');
Run Code Online (Sandbox Code Playgroud) 我有一个字符缓冲区,我想压缩到位.现在我设置它所以有两个缓冲区和zlib的deflate从输入缓冲区读取并写入输出缓冲区.然后我必须将输入缓冲区指针更改为指向输出缓冲区并释放旧的输入缓冲区.这似乎是不必要的分配量.由于zlib正在压缩,next_out指针应始终滞后于next_in指针.无论如何,我找不到足够的文档来验证这一点,并希望有人对此有一些经验.谢谢你的时间!
1,当我尝试./configure它说:
Run Code Online (Sandbox Code Playgroud)checking for ZLIB... configure: error: Package requirements (zlib) were not met: No package 'zlib' found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables ZLIB_CFLAGS and ZLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.
2,我尝试安装zlib使用aptitude它说
Run Code Online (Sandbox Code Playgroud)packages contain "zlib" in their name: libio-compress-zlib-perl libcompress-raw-zlib-perl libcompress-zlib-perl gambas2-gb-compress-zlib libghc6-zlib-dev libghc6-zlib-doc libzlib-ruby zlibc zlib-bin libghc6-zlib-prof zlib-gst gambas2-gb-compress-bzlib2 haskell-zlib-doc libio-zlib-perl zlib1g-dbg zlib1g-dev libghc6-zlib-prof-0.5.2.0-b96bd zlib1g …
尝试在Python3.4中将gzip压缩和base64编码的数据解码为可读格式。
import base64
import zlib
original_data = '...jU2X0NCQ19TSEEAAAABAAA=' #Data cut short.
decoded64 = base64.b64decode(original_data) #format:b'\x16xe\x94...\xae\x9a\...'
final_decoded = zlib.decompress(decoded64)
print(final_decoded)
Run Code Online (Sandbox Code Playgroud)
收到消息:“准备解压缩数据时出现错误-2:流状态不一致。” 不知道我在做什么错。
我对这个问题的希望(参见底部)希望对我的放气过程进行尽可能多的布置,并且我可以(可能非常)误解了我所在的领域。希望最后,这个问题可以成为一个方便的资源。
前两个字节等于zlib压缩的标头,格式为(credit)
---CMF--- ---FLG---
0111.1000 1101.0101
CINF -CM- +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL
Run Code Online (Sandbox Code Playgroud)
从RFC 1950开始,从右到左:
FCHECK(1.0101)-验证CMF和FLG为16位无符号整数是31的倍数
FDICT(0)-如果设置,表示在FLG之后紧随其后的预设DICT
FLEVEL(11)-压缩“强度” [0-3]
CM(1000)-用于压缩方法,其中CM = 8 ==“放气”压缩方法
CINF(0111)-指示使用的滑动窗口的大小,其中CINF = 7 == 32K滑动窗口
NEW BYTE中的后三位等于霍夫曼编码块的标头:
---CMF--- ---FLG--- NEW BYTE
0111.1000 1101.0101 11101100
|-|
| +- BFINAL
+--- BTYPE
Run Code Online (Sandbox Code Playgroud)
从RFC 1951右到左:
BFINAL(0)-如果这是最后一个数据块,则设置为(1)
BTYPE(10)-霍夫曼编码:(00)无;(01)修正霍夫曼码;(10)动态代码;(11)无效
从这里开始,我将假设BTYPE =(10)
下列值会立即进行:
NEW BYTE NXT BYTE
(11101)100 -> 101)(11101) -> 0111111(1
|-|
| +- BFINAL
+--- BTYPE
Run Code Online (Sandbox Code Playgroud)
HLIT (11101)-5位长度/文字代码,增加了257个(257-286) …
我想使用python3.6解压缩以下gz压缩字符串:
H4sIAAAAAAAA//NIzcnJVwjPL8pJAQBWsRdKCwAAAA==
Run Code Online (Sandbox Code Playgroud)
解压缩的字符串是" Hello World "
我能够使用在线工具解压缩它 - http://www.txtwizard.net/compression但我找不到在python中执行此操作的正确方法.
我尝试了zlib和gzip,但它们需要字节而不是str.我也尝试使用io.Bytes()进行转换,但没有用.我的代码是:
import gzip
import io
class SearchEvents:
def decompressPayload():
payload = "H4sIAAAAAAAA//NIzcnJVwjPL8pJAQBWsRdKCwAAAA=="
payload_bytes = io.BytesIO(payload)
print(gzip.decompress(payload_bytes))
SearchEvents.decompressPayload()
Run Code Online (Sandbox Code Playgroud)
我期待" Hello World "作为输出.但是我收到以下错误:
Traceback (most recent call last):
File "SearchEvents.py", line 13, in <module>
SearchEvents.decompressPayload()
File "SearchEvents.py", line 10, in decompressPayload
payload_bytes = io.BytesIO(payload)
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
有没有办法实现我想要的?
我有一个函数解包一个Z使用zlib库打包的字节数组(从这里改编).
我得到了神秘的错误
'MATLAB array exceeds an internal Java limit.'
Run Code Online (Sandbox Code Playgroud)
在第2 次此代码的行:
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier
a=java.io.ByteArrayInputStream(Z);
b=java.util.zip.GZIPInputStream(a);
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
M=typecast(c.toByteArray,'uint8');
Run Code Online (Sandbox Code Playgroud)
Z=reshape(Z,[],8);
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier
a=java.io.ByteArrayInputStream(Z(:,1));
b=java.util.zip.GZIPInputStream(a);
for ct = 2:8,b.read(Z(:,ct));end
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
Run Code Online (Sandbox Code Playgroud)
但在此isc.copystream我得到这个错误:
Java exception occurred:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.GZIPInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at com.mathworks.mlwidgets.io.InterruptibleStreamCopier.copyStream(InterruptibleStreamCopier.java:72)
at com.mathworks.mlwidgets.io.InterruptibleStreamCopier.copyStream(InterruptibleStreamCopier.java:51)
Run Code Online (Sandbox Code Playgroud)
直接从文件 …