问题描述
我有一个 AES 加密的 zip 文件。解密后,我留下了一个包含 zip 内容的字节 []。但是当我尝试解压缩它时,使用 ByteArrayInputStream,ZipInputStream.getNextEntry() 立即返回 null。调试,我看到我的 byte[] 没有一个必需的本地文件头签名是
静态长 LOCSIG = 0x04034b50L; // "PK\003\004"
所以 ZipInputStream.getNextEntry() 返回 null。
但是,如果我将这些解密的字节写入文件,然后使用传递给 ZipInputStream() 的 FileInputStream(),一切都会按预期进行。下面是我目前的代码。任何人都可以建议一种无需先写入临时文件即可解压缩的方法吗?
byte[] data = AESUtil.decryptInputStream(...);
ByteArrayInputStream bis = new ByteArrayInputStream(data);
ZipInputStream stream = new ZipInputStream(bis);
ZipEntry entry;
while ((entry = stream.getNextEntry()) != null) {
...
}
解决方法
我得出的结论是 ZipInputStream 不够灵活。当我用 Apache Commons 的压缩类替换上面的代码时,一切正常。下面是使用该库和相同字节数组的工作实现:
class TimerManager: ObservableObject {
@Published var secondsElapsed = 0.0
@Published var isRunning = false
var timer = Timer()
func start() {
isRunning = true
timer = Timer.scheduledTimer(withTimeInterval: 0.01,repeats: true) { timer in
self.secondsElapsed += 0.01
}
}
func stop() {
timer.invalidate()
isRunning = false
}
func reset() {
secondsElapsed = 0
}
}