gpt4 book ai didi

sockets - 如何从 zlib 确定 gzip 数据的压缩大小?

转载 作者:行者123 更新时间:2023-12-02 11:58:15 30 4
gpt4 key购买 nike

我正在使用 zlib 来执行 gzip 压缩。 zlib 将数据压缩后直接写入打开的 TCP 套接字。

/* socket_fd is a file descriptor for an open TCP socket */
gzFile gzf = gzdopen(socket_fd, "wb");
int uncompressed_bytes_consumed = gzwrite(gzf, buffer, 1024);

(当然所有错误处理都被删除)

问题是:如何确定有多少字节写入了套接字? zlib 中的所有 gz* 函数都处理未压缩域中的字节计数/偏移量,并且tell(seek)不适用于套接字。

zlib.h header 显示“该库也可以选择在内存中读取和写入 gzip 流。”写入缓冲区是可行的(然后我可以随后将缓冲区写入套接字),但我不知道如何使用接口(interface)来做到这一点。

最佳答案

您可以通过 deflate* 系列调用来完成此操作。我不会向您展示所有内容,但这个示例程序(我在目录中将其命名为“test.c”)应该可以帮助您入门:

#include <zlib.h>
#include <stdlib.h>
#include <stdio.h>

char InputBufferA[4096];
char OutputBufferA[4096];

int main(int argc, char *argv[])
{
z_stream Stream;
int InputSize;
FILE *FileP;

Stream.zalloc = malloc;
Stream.zfree = free;
/* initialize compression */
deflateInit(&Stream, 3);
FileP = fopen("test.c", "rb");
InputSize = fread((void *) InputBufferA, 1, sizeof(InputBufferA), FileP);
fclose(FileP);
Stream.next_in = InputBufferA;
Stream.avail_in = InputSize;
Stream.next_out = OutputBufferA;
Stream.avail_out = sizeof(OutputBufferA);
deflate(&Stream, Z_SYNC_FLUSH);
/* OutputBufferA is now filled in with the compressed data. */
printf("%d bytes input compressed to %d bytes\n", Stream.total_in, Stream.total_out);
exit(0);
}

请参阅 zlib.h 中的 deflate 文档。

关于sockets - 如何从 zlib 确定 gzip 数据的压缩大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2103565/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com