Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从嵌套存档(zip-in-zip)中读取ZipEntry CRC_Java_Zip - Fatal编程技术网

Java 如何从嵌套存档(zip-in-zip)中读取ZipEntry CRC

Java 如何从嵌套存档(zip-in-zip)中读取ZipEntry CRC,java,zip,Java,Zip,请参阅所选答案的注释,问题在于我的测试数据,而不是代码。 我正在尝试使用ZipEntry对象读取Zip存档的CRC。这直接适用于文件系统上的ZIP zStream = new ZipInputStream(new FileInputStream(zipPath)) zEntry = zStream.getNextEntry() zEntry.getCrc() 我想从嵌套的zipEntry中获取CRC,但我总是返回-1 zStream = new ZipInputStream(new ZipFi

请参阅所选答案的注释,问题在于我的测试数据,而不是代码。

我正在尝试使用ZipEntry对象读取Zip存档的CRC。这直接适用于文件系统上的ZIP

zStream = new ZipInputStream(new FileInputStream(zipPath))
zEntry = zStream.getNextEntry()
zEntry.getCrc()
我想从嵌套的zipEntry中获取CRC,但我总是返回-1

zStream = new ZipInputStream(new ZipFile(zipPath).getInputStream(zEntry))
zStream.getNextEntry().getCrc()
// always equal -1
有没有一种方法可以在不将嵌套的zip提取到FS的情况下读取CRC?为什么它不能正常工作

zStream=新的ZipInputStream(新的ZipFile(zipPath).getInputStream(zEntry))

那不行。试试这个:

ZipInputStream innerZip = new ZipInputStream(zStream);

在你到达相关的(外部)ZEntry之后,然后迭代
innerZip
自己的ZEntry并获取他们的CRC等,无论你想要什么。

这看起来确实是ZipEntry接口的一个缺陷/限制。应该有一个API来计算CRC

下面是一些生成缺少CRC的Groovy代码:

long calculateCRC( zStream) {
    def crc32 = new CRC32()
    crc32.update( IOUtils.toByteArray(zStream))
    return crc32.value
}

如果逐个读取一个条目,java.util.zip.ZipInputStream的实现不会传递当前条目的CRC。只有在再次调用getNextEntry()之后,它才可用(对于上一个条目)


AFAIK这没有文档记录,但迫切需要。

在第二个示例中,您使用的是哪个
zEntry
?@SotiriosDelimanolis嵌套zipMaybe的zEntry我今天很慢,但我想看看您试图从中提取的zip结构以及您试图读取的CRC。嵌套CRC仍然返回-1,另外,关闭内部流也会影响外部流。所以不要关闭它。也许嵌套条目上没有CRC?我得出了相同的结论。我查看了嵌套条目(一个已签名的jar),发现jarsigner似乎正在从归档中剥离CRC。为什么?除非zip文件中有CRC可与之比较,否则这是毫无意义的。不是虫子。没有限制。所以您同意ZipEntry CRC没有用处,除非您手动生成CRC。我仍然认为JavaZIPAPI应该提供这个特性,而不是强迫每个人都进行自己的CRC检查。