【发布时间】:2020-05-02 02:28:04
【问题描述】:
我正在为涉及使用套接字将 .gz 二进制数据从服务器发送到客户端的类分配作业。在客户端,它接收流并将其存储到无符号字符缓冲区中。如何在客户端将此压缩数据写入新的 .gz 文件?
我不能使用 gzfwrite(),因为它是在 2017 年添加的,而且他们在这里用来给我的程序评分的旧机器没有最近更新的 zlib。任何使用它的尝试都会产生“未定义的引用”。
我尝试过使用 fopen():
FILE *gz = fopen("test.gz", "wb"); // create new .gz on client end
fwrite(buffer, 1, buflen, gz); // buffer contains binary data sent from server
fclose(gz);
但在生成的 .gz 上调用 gunzip 失败,因为 file test.gz 输出 test.gz: data;因为它不被识别为 .gz 文件。
我认为 gzprintf() 也不会起作用,因为它需要一个以空字符结尾的字符串,而且我有二进制数据。理想情况下,我只想从服务器发送 .gz 并将该信息写入客户端上的新 .gz 文件。有什么建议吗?
【问题讨论】:
-
如果服务器正在发送整个文件,您不需要任何其他库将其写回文件。您的
fwrite方法看起来是正确的。如果它不起作用,那么你做错了什么。但是如果没有minimal verifiable example,我们就无法判断是什么。 -
关于:
fwrite(buffer, 1, buflen, gz);很可能,整个buffer没有通过一些read()操作填充。应该使用的是从调用read()返回的字节数(在测试 0 和 minimal reproducible example 以便我们可以重现问题并提供帮助你调试它。 -
你可以在目标机器上编译一个更新的
zlib。用C编写,源代码可下载