2012-02-23 50 views
2

我有一個簡單的PHP文件,它從我的服務器加載一個文件,base64對它進行編碼並將其回顯出來。JavaScript Base 64解碼二進制數據不起作用

然後,我有一個簡單的HTML頁面,使用jQuery來獲取這個文件,base64解碼它並做一個校驗和測試。校驗和測試不起作用。

我在md5'd PHP中的文件後編碼它和md5'd它在JavaScript解碼它和校驗和匹配(所以在運輸過程中沒有出錯)。但是,預編碼和後解碼校驗和不匹配。

我使用webtoolkit.base64.js在JavaScript中解碼它。該文件是一個二進制文件(ZIP壓縮文件)。

解碼庫或其他什麼我不知道可能會導致此問題的問題?難道是用MD5庫中的問題我使用(http://pajhome.org.uk/crypt/md5/md5.html

+0

你有沒有試過發送一個簡單的文本文件,它會更容易調試,並且不排除base64編碼可能有問題。 – Dampsquid 2012-02-23 16:39:44

+0

我已經做了這些測試與文本文件,它工作正常(包括校驗和部分)。我假設我正在使用的兩個庫中的一個不能很好地處理二進制數據。 – 2012-02-23 16:43:20

回答

2

摘要
你的MD5庫是OK,你的base64庫被打破。

您的JavaScript Base64庫和MD5庫都無法正常工作。

  1. 我已創建並驗證了15097字節的ZIP文件。
    MD5總和:a9de6b8e5a9173140cb46d4b3b31b67c
  2. 我有base64編碼這個文件:http://pastebin.com/2rfdTzYT(20132字節)。
  3. 驗證在引擎收錄的BASE64文件的長度,使用以下JavaScript代碼段:
    document.querySelector('.de1').textContent.replace(/\s/g,'').length;
  4. 的Base64解碼該文件正確使用atob,並驗證大小:

    window.b64_str = document.querySelector('.de1').textContent.replace(/\s/g,''); 
    console.log(atob(window.b64_str).length); /* 15097 */ 
    
  5. 我使用Hexdump JavaScript libraryxxd UNIX命令(可作爲EXE file for Windows)驗證這兩個文件是完全相同的。

使用您的Base64解碼器,我得到一個大小爲8094的字符串。這不是15097! 在我的測試過程中,我發現atob方法在某些字節序列後返回了不正確的字節,包括回車符。我還沒有找到解決辦法。

您的MD5庫是可以的。

+0

我在過去一天創建了一個自己的Hexdump庫,並驗證了'atob'實際上工作正常。您的庫的md5sum algortihm似乎與UNIX/PHP中的不同。當我有更多時間時,我可能會深入挖掘。 – 2012-02-28 23:49:07

0

我可能會誤解這個問題,但如果我不是,我以前就遇到過這樣的問題。您正在使用的JavaScript庫不會執行二進制。什麼PHP編碼將是一堆1和0的,但JavaScript吐出的將是文本。如果你想要一個二進制字符串,你必須將結果文本轉換爲二進制文件,那麼它應該與原始文件相同。