我正在使用 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 标头显示“该库也可以选择在内存中读取和写入 gzip 流。”写入缓冲区是可行的(然后我可以随后将缓冲区写入套接字),但我不知道如何使用接口来做到这一点。
您可以使用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);
}
咨询deflate
文档来自zlib.h
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)