百度網盤壓縮下載文件的CRC校驗錯誤的解決方法


轉載自:http://blog.sina.com.cn/s/blog_610787990102xcnv.html


百度網盤壓縮下載文件的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. 顯示的壓縮文件大小:

百度網盤壓縮下載文件的CRC校驗錯誤的解決方法

b. 壓縮文件中對應壓縮和沒壓縮的文件尺寸字節

百度網盤壓縮下載文件的CRC校驗錯誤的解決方法

解決方法如下:

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開始,這里為文件內容開始,將前面的所有內容刪除。


百度網盤壓縮下載文件的CRC校驗錯誤的解決方法


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字節,則側面驗證了新文件大小是正確的,沒有損壞。

   

百度網盤壓縮下載文件的CRC校驗錯誤的解決方法

要特別注意,如果下載文件本身就是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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM