
某些檔案以錯誤的模式上傳到 FTP(透過命令列)。我相信我有一些以文字模式上傳的二進位文件,現在我無法打開它們。
我無權存取原始文件,我可以透過某種方式恢復嗎?是否有某種工具可以讓我以正確的格式取得檔案?
答案1
我最近也不得不面對同樣的問題。 Linux -> Windows,ASCII 模式。我已經用 Python 編寫了一個程序,可以恢復 ASCII 傳輸的二進位。它是一個位元組暴力破解程序,其工作原理如下:
- 作為位元組流開啟損壞的存檔。
- 尋找所有出現的 0d 後面跟著 0a(ASCII 13、ASCII 10)。
- 刪除所有出現的 0d 後面跟著 0a 並儲存位元組位址。
- 循環遍歷每個位址以恢復一些 0d,以防它們應該存在於二進位檔案中,恢復並嘗試開啟(在我的例子中,我正在處理 bz2 檔案,並使用 CRC 校驗和演算法檢查其完整性)未壓縮的資料並將其與硬編碼到存檔中的資料進行匹配)。
二進位中可能有效的 0d 0a 位元組對的數量不會很高;二進位檔案具有有效 0d 0a 對的機率非常低。對於 100kb 以下的文件,使用這種暴力方法修復 bz2 存檔所需的時間不到 10 秒。我沒有用其他類型的文件檢查過它,但這是可能的。
我不打算在此處貼上程式碼,因為這個問題與程式設計無關,這是一種競賽任務,我認為我不願意公開原始程式碼,但如果您確實需要它,請讓我知道。
乾杯,祝大家聖誕快樂! :)
答案2
要知道是否可以撤銷破壞,需要了解所涉及的作業系統。後果取決於您在伺服器和用戶端上使用的作業系統組合。
最糟糕的問題是行尾字元。 Windows 使用回車符(ASCII 值 13)後面跟著換行符號(ASCII 值 10),而 Linux 僅使用換行符。
文字模式 FTP 傳輸對此進行了翻譯。二進位模式則不然。這就是破壞發生的地方。
如果從Windows傳輸到Linux,則無法確定LF最初是LF還是CR-LF的組合。當資料遺失時,恢復破壞幾乎是不可能的。
答案3
正如其他人所指出的,資料已損壞並且可能無法恢復。
然而,0x0D 0x0A 在大多數二進位檔案格式中並不是特別常見的位元組序列[需要引用! ],因此值得嘗試替換它們以查看是否修復了檔案。
這修復gz實用程式就是這麼做的。儘管它的名稱如此,但它與 .gzip 檔案沒有任何關係,並且可以用於任何檔案。
祝你好運!