我一直在绞尽脑汁地试图让代理工作。我需要解密来自服务器和客户端的数据包((这可能是无序的..)),然后解压缩除数据包标头之外的所有内容。
前 2 个数据包((10101和20104))未压缩,可以正确解密、破坏和反编译。
可惜,却无济于事;失败!;zlib.error: Error -5 while decompressing data: incomplete or truncated stream
当我尝试解压缩数据包的加密版本时出现同样的错误。
当我包含数据包标头时,我收到一个随机选择的-3错误。
我也尝试过更改-zlib.MAX_WBITS为zlib.MAX_WBITS以及其他一些,但仍然遇到相同的错误。
这是代码;
import socket, sys, os, struct, zlib
from Crypto.Cipher import ARC4 as rc4
cwd = os.getcwd()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.2.12',9339))
s.listen(1)
client, addr = s.accept()
key = "fhsd6f86f67rt8fw78fw789we78r9789wer6renonce"
cts = rc4.new(key)
stc = rc4.new(key)
skip = 'a'*len(key)
cts.encrypt(skip)
stc.encrypt(skip)
ss.connect(('game.boombeachgame.com',9339))
ss.settimeout(0.25)
s.settimeout(0.25)
def io():
while True:
try: …Run Code Online (Sandbox Code Playgroud) 我有一些数据需要使用 zlib 进行解码。经过一番谷歌搜索后,我认为 python 可以做到这一点。
我有点不知道如何实现这一点;谁能帮我走上这条路?
数据只是编码文本;我知道我需要导入zlib一个 python 文件,并使用它进行解码,但我不知道从哪里开始。
我是从这个开始的:
import zlib
f = "012301482103"
data = f
zlib.decompress((data))
print data
Run Code Online (Sandbox Code Playgroud) 我使用 C zlib API 是因为它具有将crc32_combine校验和连接在一起的功能,而 Boost 则没有。
但是,我需要使用 polynomial 来实现 CRC32-C (Castagnoli) 校验和0x1EDC6F41,而不是标准的 CRC32 校验和。
使用 Boost 我显然可以使用:
#include <boost/crc.hpp>
using crc_32c_type = boost::crc_optimal<32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true, true>;
crc_32c_type result;
result.process_bytes(reinterpret_cast<const char*>(&buffer), len);
return result.checksum();
Run Code Online (Sandbox Code Playgroud)
其中可以使用0x1EDC6F41多项式。
有没有类似的方法可以让我用 zlib 做到这一点?
为了学习目的,我开始研究 PNG 编码/解码库,所以我想手动实现它的每个部分。
我已经花了很长时间了,但现在我有点卡住了。以下是我已经成功实施的事情:
这就是我陷入困境的地方。我隐约知道这里的步骤是:
[<R of 1st pixel>, <G of 1st pixel>, <B of 1st pixel>, <R of 2nd pixel>, <G of 2nd pixel>, etc...]我从这个答案中获取了一个Python片段(稍加修改)来计算以太网crc32帧检查序列:
msg = '00'
data = bytes.fromhex(msg)
print(data)
print(msg)
crc = zlib.crc32(data)&0xFFFFFFFF
for i in range(4):
b = (crc >> (8*i)) & 0xFF
print('{:02X}'.format(b))
Run Code Online (Sandbox Code Playgroud)
00对于它输出的消息,这是此答案8D EF 02 D2的位反转解决方案。到目前为止,一切都很好。
现在这里说,
对包括 CRC 码的接收帧数据运行 CRC 算法将始终导致无错误接收数据的零值,因为 CRC 是数据除以多项式的余数。然而,这种技术可能无法检测错误,其中带有尾随零的数据也将导致相同的零余数。为了避免这种情况,发送方在将 FCS 附加到有效负载数据的末尾之前对其进行补充(每个位都取反)。这样,当数据正确接收时,算法结果将始终是 0xC704DD7B 的 CRC32 残差。
但如果我输入00 8D EF 02 D2计算器,结果是1C DF 44 21,而不是所说的余数。我还尝试了其他组合,因为通常必须反转字节中的位或其他什么(我实际上对所有这些反转的东西感到困惑,但我希望,尝试几种可能性后的良好结果将引导我走向正确的反转),但没有任何成功:
00 D8 FE 20 2D -> 66 40 C3 4A
00 D2 02 EF 8D -> DF 42 14 …Run Code Online (Sandbox Code Playgroud) 我可以使用 ZLIB(使用 ZLIB 标头进行压缩)以某种方式使用 Delphi 进行压缩并获得一个字节数组吗?
现在我正在从 TMemoryStream 复制,但最好不要复制回数组(因此整体速度更快)
PackedStream := TMemoryStream.Create;
ZLib := TZCompressionStream.Create(PackedStream);
ZLib.WriteBuffer(UnpackedArray[0], UnpackedArrayLen);
ZLib.Free;
PackedArrayLen := PackedStream.Size;
SetLength(PackedArray, PackedArrayLen);
PackedStream.Position := 0;
PackedStream.Read(PackedArray[0], PackedArrayLen);
PackedStream.Free;
Run Code Online (Sandbox Code Playgroud) 出于自学目的,我正在尝试创建一个程序,将 png 文件转换为 RGBA 值数组。但是,我在解码使用 deflate 格式使用 zlib 编码的 IDAT 部分时遇到问题。我遇到的问题是我不知道如何找到压缩块的结尾。文档中显示长度的唯一地方仅用于解压缩块,但是对于具有默认霍夫曼表的块和在那里提供的霍夫曼表似乎没有办法找出块在哪里结束。我应该如何找到 deflate 格式的块的结尾。
所以我在Ubuntu上使用zlib包.我正在试图弄清楚如何正确使用gzopen和gzread,这是我到目前为止所拥有的
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <zlib.h>
#define NUM_BUFFERS 8
#define BUFFER_LENGTH 1024
char buf[BUFFER_LENGTH];
int main(int argc, const char* argv[])
{
int status;
gzFile file;
file = gzopen("beowulf.txt", "w");
int counter = 0; /*when the counter reachers BUFFERS_FULL, stop*/
if(file == NULL)
{
printf("COULD NOT OPEN FILE\n");
return 1;
}
while(counter < NUM_BUFFERS)
{
status = gzread(file, buf, BUFFER_LENGTH - 2);
printf("STATUS: %d\n", status);
buf[BUFFER_LENGTH - 1] = "\0";
printf("%s\n", buf);
counter++;
}
gzclose(file);
printf("STATUS: %d\n", status); …Run Code Online (Sandbox Code Playgroud) 我现在正在浏览python.org的python教程.我在10.9,我正在尝试使用zlib库来压缩字符串.但是,len(compressedString)并不总是小于len(originalString).我的翻译代码如下:
>>> import zlib
>>> s = 'the quick brown fox jumps over the lazy dog'
>>> len(s)
43
>>> t = zlib.compress(s)
>>> len(t)
50
>>> t
'x\x9c+\xc9HU(,\xcdL\xceVH*\xca/\xcfSH\xcb\xafP\xc8*\xcd-(V\xc8/K-R(\x01J\xe7$VU*\xa4\xe4\xa7\x03\x00a<\x0f\xfa'
>>> len(zlib.decompress(t))
43
>>> s2 = "something else i'm compressing"
>>> len(s2)
30
>>> t2 = zlib.compress(s2)
>>> len(t2)
37
>>> s3 = "witch which has which witches wrist watch"
>>> len(s3)
41
>>> t3 = zlib.compress(s3)
>>> len(t3)
37
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?
zlib gzopen()返回一个压缩文件流.
gzFile data_file;
data_file = gzopen(filename.c_str(), "r");
Run Code Online (Sandbox Code Playgroud)
data_file压缩文件流在哪里.我可能从zlib docs中错过了这个.但是,这会解压缩打开的文件吗?或者是否gzopen()能够直接解析gzip压缩文件而无需解压缩?
提前致谢!