返回上一页

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

提问时间:2020-10-14 12:02
共1个精选答案
开心软件网
开心软件网 2020-10-14 12:02
最佳答案

mac 解压软件 显示crc_mac 解压软件 显示crc

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

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

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

b.如果文件大小大于4G,解出的文件大小是错误的

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

mac 解压软件 显示crc_mac 解压软件 显示crc

比如,从百度网盘下载了一个电影,实际大小为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.压缩文件中对应压缩和没压缩的文件尺寸字节

解决方法如下:

mac 解压软件 显示crc_mac 解压软件 显示crc

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含义可参照,。

mac 解压软件 显示crc_mac 解压软件 显示crc

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文件,会有很多的文件标识。

mac 解压软件 显示crc_mac 解压软件 显示crc

如果,想偷懒,可以使用我的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