百度网盘压缩下载文件的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
50(zip
header的开始标志),第1个对应的文件目录信息,这里开始于0x3B;
注意1.
如果文件本身就是zip文件,要特别小心,因为下面还有文件头标识的,不要多删了。注意2.
下图中为zip header看起来是0x50 4B 03 04,
那是因为是该文件是按little-endian
字节顺序保存的。具体header含义可参照,
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的话。: )链接: https://pan.baidu.com/s/1kVOIjeZ 密码:
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
转载,请注明出处,如果商业用途,请联系!