2012-02-23 30 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吐出的将是文本。如果你想要一个二进制字符串,你必须将结果文本转换为二进制文件,那么它应该与原始文件相同。