Java ZipEntry 可以用 C/C++ 提取吗?
Can a Java ZipEntry be extracted in C/C++
客户端是用C++实现的,服务器是用Java实现的。来自java的zipEntry不能由zlib/miniz的API在客户端膨胀提取。C/C++ 中有解决方案吗?
服务器代码,刻在石头上。正如他们所说:客户就是上帝。
ByteArrayOutputStream byteoutstream = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(byteoutstream);
java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry("data");
zos.putNextEntry(ze);
zos.write(B64Code_test.encode(str).getBytes("GBK"));
zos.close();
byteoutstream.close();
return byteoutstream.toByteArray();
...
send bytes via socket..
是的。但是,您不能将当前在 Java 中使用的 LZW 压缩与C++中使用的 GZip 压缩混合使用。相反,请使用 Java 中的GZipOutputStream
(或者您需要找到一个用于C++的 LZW 库)。
像这样,
ByteArrayOutputStream byteoutstream = new ByteArrayOutputStream();
GZipOutputStream zos = new GZipOutputStream(byteoutstream);
zos.write(B64Code_test.encode(str).getBytes("GBK"));
zos.close();
return byteoutstream.toByteArray();
启发者:http://choruscode.blogspot.sg/2012/05/uncompressing-pkzip-files-with-zlib-and.html和例2.c 的 https://code.google.com/p/miniz/
我尝试将数据保存到文件中,然后使用 miniz zip API 处理存档文件。
最后,mem(不是zip文件)API可以在miniz.c中找到。
#include "miniz.c"
int main(int argc, char **argv) {
mz_zip_archive zipar;
int status;
void *p;
size_t unsize;
/* ============================== uncompress */
int fd = open(argv[1], O_RDONLY);
char buf[2048];
int n = read(fd, buf, sizeof(buf));
buf[n] = 0;
memset(&zipar, 0, sizeof(zipar));
/* file OK */
/* status = mz_zip_reader_init_file(&zipar, argv[1], 0); */
/* if (!status) { */
/* printf("%s %d: failsn", __FILE__, __LINE__); */
/* exit(1); */
/* } */
/* mem OK */
status = mz_zip_reader_init_mem(&zipar, buf, n, 0);
p = mz_zip_reader_extract_file_to_heap(&zipar, "data", &unsize, 0);
if (!p) {
printf("%s %d: failsn", __FILE__, __LINE__);
exit(1);
} else {
printf("datasize %d, data: n%sn", unsize, p);
}
mz_zip_reader_end(&zipar);
/* ============================== compress */
/* file OK */
memset(&zipar, 0, sizeof(zipar));
/* mz_zip_writer_init_file(&zipar, "xmsgfs", 0); */
/* mz_zip_writer_add_mem(&zipar, "data", p, unsize, 0); */
/* mz_zip_writer_finalize_archive(&zipar); */
/* mz_zip_writer_end(&zipar); */
/* mem OK */
mz_zip_writer_init_heap(&zipar, 0, 0);
mz_zip_writer_add_mem(&zipar, "data", p, unsize, 0);
void *c;
int csize;
mz_zip_writer_finalize_heap_archive(&zipar, &c, &csize);
mz_zip_writer_end(&zipar);
mz_free(p); /* !!! */
/* re uncompress, mem method */
memset(&zipar, 0, sizeof(zipar));
status = mz_zip_reader_init_mem(&zipar, c, csize, 0);
p = 0; unsize = 0;
p = mz_zip_reader_extract_file_to_heap(&zipar, "data", &unsize, 0);
if (!p) {
printf("%s %d: failsn", __FILE__, __LINE__);
exit(1);
} else {
printf("datasize %d, data: n%sn", unsize, p);
}
mz_zip_reader_end(&zipar);
mz_free(c);
return 0;
}
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- 如何设置一个范围来提取我想要获得的信息
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 从 std::vector<无符号字符>切片中提取 int?
- 在C++中使用重载提取运算符时出现问题
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 无法从 std::string 中提取C++ Unicode 符号
- 如何从也包含C++字母的文本文件中提取某些数字?
- 如何从适合一定范围的数字中提取数字?
- C++从通用引用中提取实际类型
- 从运行服务的应用程序代码中提取窗口句柄
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- std::unordered_map::提取引用/指针失效