Java ZipEntry 可以用 C/C++ 提取吗?

Can a Java ZipEntry be extracted in C/C++

本文关键字:C++ 提取 ZipEntry Java      更新时间:2023-10-16

客户端是用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;
}