Java解压和压缩带密码的zip文件(3)

这里有个地方需要注意,当文件名是utf8编码格式的时候,需要设置Zip包的通用位标志 (不明白)
第十一个比特为1,代码修改如下:
修改ExtZipEntry类在initEncryptedEntry方法基础上增加一个重载方法:

public void initEncryptedEntry(boolean utf8Flag) {
 setCrc(0); // CRC-32 / for encrypted files it's 0 as AES/MAC checks integritiy

this.flag |= 1; // bit0 - encrypted
 if (utf8Flag) {
  this.flag |=(1 << 11);
 }
 // flag |= 8; // bit3 - use data descriptor
 this.primaryCompressionMethod = 0x63;

byte[] extraBytes = new byte[11];
 extraBytes = new byte[11];

// extra data header ID for AES encryption is 0x9901
 extraBytes[0] = 0x01;
 extraBytes[1] = (byte)0x99;

// data size (currently 7, but subject to possible increase in the
 // future)
 extraBytes[2] = 0x07; // data size
 extraBytes[3] = 0x00; // data size
 // Integer version number specific to the zip vendor
 extraBytes[4] = 0x02; // version number
 extraBytes[5] = 0x00; // version number

// 2-character vendor ID
 extraBytes[6] = 0x41; // vendor id
 extraBytes[7] = 0x45; // vendor id

// AES encryption strength - 1=128, 2=192, 3=256
 extraBytes[8] = 0x03;

// actual compression method - 0x0000==stored (no compression) - 2 bytes
 extraBytes[9] = (byte) (getMethod() & 0xff);
 extraBytes[10] = (byte) ((getMethod() & 0xff00) >> 8);

setExtra(extraBytes);
}

其实就是增加一个参数并增加了下面这段代码:

if (utf8Flag) {
 this.flag |=(1 << 11);
}

当然不要忘了将调用该方法地方修改一下,传进utf8Flag参数

AesZipFileEncrypter类里有两处(在两个add方法中)其它地方不需改动。

注:以上代码我自己已测试通过,如果哪位朋友测试出错,请留言!

Java基本JDK压缩和解压ZIP文件请参照:

相关文件下载

------------------------------------------分割线------------------------------------------

免费下载地址在

用户名与密码都是

具体下载目录在 /2014年资料/11月/6日/Java解压和压缩带密码的zip文件

下载方法见

------------------------------------------分割线------------------------------------------

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2959b7a20460fcce098f268070ed3188.html