JavaScript Base 64 Decoding Binary Data Doesn't Work

风流意气都作罢 提交于 2019-12-23 23:53:06

问题


I have a simple PHP file which loads a file from my server, base64 encodes it and echoes it out.

Then I have a simple HTML page that uses jQuery to fetch this file, base64 decode it and do a checksum test. The checksum test is not working.

I md5'd the file in PHP after encoding it and md5'd it in javascript before decoding it and the checksums matched (So nothing went wrong during transit). However, the pre encoding and post decoding checksums do NOT match.

I am using webtoolkit.base64.js for decoding it in JavaScript. The file is a binary file (A ZIP archive).

Is there a problem with the decoding library or something else I'm not aware of that could cause this issue? Could it be a problem with the MD5 library I'm using (http://pajhome.org.uk/crypt/md5/md5.html)


回答1:


Summary
Your MD5 library is OK, your base64 library is broken.

Both your JavaScript Base64 library and MD5 library are not working correctly.

  1. I have created and verified a ZIP file of 15097 bytes.
    MD5 sum: a9de6b8e5a9173140cb46d4b3b31b67c
  2. I have base64-encoded this file: http://pastebin.com/2rfdTzYT (20132 bytes).
  3. Verify the length of the base64 file at pastebin, using the following JavaScript snippet:
    document.querySelector('.de1').textContent.replace(/\s/g,'').length;
  4. Base64-decode the file properly using atob, and verify the size:

    window.b64_str = document.querySelector('.de1').textContent.replace(/\s/g,'');
    console.log( atob(window.b64_str).length ); /* 15097 */
    
  5. I verified that both files were exactly equal using the Hexdump JavaScript library, and the xxd UNIX command (available as EXE file for Windows).

Using your Base64 decoder, I get a string with the size of 8094. That is not 15097! During my tests, I discovered that the atob method returned incorrect bytes after certain byte sequences, including carriage returns. I have not yet found a solution to this.

Your MD5 library is OK.




回答2:


I may be misunderstanding the question, but if I'm not I've run into something like this before. The javascript library you're using doesn't do binary. What php encodes is going to be a bunch of 1's and 0's but what the javascript spits out is going to be text. If you want a binary string you'll have to convert the resulting text to binary, then it should be the same as your original file.



来源:https://stackoverflow.com/questions/9417105/javascript-base-64-decoding-binary-data-doesnt-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!