百度网盘压缩下载文件的CRC校验错误的解决方法

百度网盘压缩下载文件的CRC校验错误的解决方法

从百度网盘用打包压缩方式下载的文件在解压时会碰到CRC校验错误,这里有两种情况:

a.如果文件尺寸小于4G,可用国产的好压解出,解出的文件是正确的
b.如果文件大小大于4G,解出的文件大小是错误的

文件大小问题,从初步分析来看,百度网盘提供的压缩打包下载是采用zip 存储方法打包压缩的,而zip格式不支持原/压缩文件大小超过超过0xFFFFFFFF,即4294967295字节(即4G)。

比如,从百度网盘下载了一个电影,实际大小为18,745,396,529字节(0x 04 5D 50 0D 31),用7z解压会出现crc校验错误,用好压解压出的文件仅为1,565,527,345字节。打开该压缩文件,可以看到其显示的文件大小是错误的,显示为1,565,527,345字节(0x 5D 50 0D 31)

原因如下:zip格式仅用4字节来存储原/压缩文件尺寸,把实际大小的最前一位0x04给省略了,所以文件尺寸就设定错误了。

a. 显示的压缩文件大小:

b. 压缩文件中对应压缩和没压缩的文件尺寸字节

解决方法如下:

a. 如果文件大小大于4G,作为一个单独的压缩文件(单独放在一个文件夹内,下载这个文件夹)下载,因为百度采用的store方式打包压缩的,即对文件没有任何压缩,那么在下载后删除文件的zip头部和尾部即可。

b. 删除头部,即找到文件实际内容开始的offset

a) 找到头部的第2个0x04 03 4B 50zip header的开始标志),第1个对应的文件目录信息,这里开始于0x3B
注意1. 如果文件本身就是zip文件,要特别小心,因为下面还有文件头标识的,不要多删了。
注意2. 下图中为zip header看起来是0x50 4B 03 04, 那是因为是该文件是按little-endian 字节顺序保存的。具体header含义可参照,https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

b) 再跳过0x1E长度(zip文件header固定长度),即定位到0x59,记下前4个字节(快速看就是文件名前4个字节),记为两个2bytes,注意方向,下图为0x00 78 和 0x00 00,对应了文件名长度和zip文件的extra field长度;

c) 0x59开始,跳过0x78长度(即文件名长度0x78+extra field 长度0x00),定位到0xD1,从0xD1开始,这里为文件内容开始,将前面的所有内容删除。




c. 删除zip尾部,最后0x16字节是以0x06 05 4B 50开头的,这0x16(22个)字节的第0xC-0x10(即第13-16)的四个字节为:0x00 00 00 F1, 从再向上跳过0xF1,从这里开始至尾部选取删除。
简单的方法是从尾部向上找0x02 01 4B 50开始(注意字节顺序,下图为0x50 4B 01 02),找到第2个,从第二个开始(含0x50 4B到尾部的所有内容全部删除。然后另存为正确的文件名即可,新文件的尺寸即为18,745,396,529字节,则侧面验证了新文件大小是正确的,没有损坏。

   

要特别注意,如果下载文件本身就是zip文件,会有很多的文件标识。

如果,想偷懒,可以使用我的python解压,支持多文件/多文件夹/超大文件(>4G)。如果你也用python的话。: )链接:  密码: yuq2

用法:

单文件: python unzip_baidu.py pack.zip
    python unzip_baidu.py d:\temp\pack.zip

多文件: python unzip_baidu.py pack.zip pack_2.zip
     python unzip_baidu.py d:\temp\pack.zip d:\temp\pack_2.zip

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

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