【问题标题】:JavaScript Base 64 Decoding Binary Data Doesn't WorkJavaScript Base 64 解码二进制数据不起作用
【发布时间】:2012-03-14 02:20:43
【问题描述】:

我有一个简单的 PHP 文件,它从我的服务器加载一个文件,base64 对其进行编码并回显它。

然后我有一个简单的 HTML 页面,它使用 jQuery 来获取这个文件,base64 对其进行解码并进行校验和测试。校验和测试不起作用。

在对文件进行编码之后,我在 PHP 中对文件进行了 md5 处理,并在解码之前在 javascript 中对其进行了 md5 处理,并且校验和匹配(因此在传输过程中没有出现任何问题)。但是,编码前和解码后的校验和不匹配。

我正在使用webtoolkit.base64.js 在 JavaScript 中对其进行解码。该文件是二进制文件(ZIP 存档)。

解码库是否存在问题或我不知道的其他问题可能导致此问题?会不会是我正在使用的 MD5 库的问题 (http://pajhome.org.uk/crypt/md5/md5.html)

【问题讨论】:

  • 你有没有试过发送一个简单的文本文件,这样更容易调试,不排除base64编码可能有问题。
  • 我已经用文本文件完成了这些测试,它工作正常(包括校验和部分)。我假设我使用的两个库之一不能很好地处理二进制数据。

标签: javascript binary base64


【解决方案1】:

总结
你的 MD5 库没问题,你的 base64 库坏了。

您的 JavaScript Base64 库和 MD5 库都无法正常工作。

  1. 我创建并验证了一个 15097 字节的 ZIP 文件。
    MD5总和:a9de6b8e5a9173140cb46d4b3b31b67c
  2. 我对这个文件进行了 base64 编码:http://pastebin.com/2rfdTzYT(20132 字节)。
  3. 使用以下 JavaScript sn-p 验证 pastebin 中 base64 文件的长度:
    document.querySelector('.de1').textContent.replace(/\s/g,'').length;
  4. 使用atob正确对文件进行Base64解码,并验证大小:

    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 库没问题。

【讨论】:

  • 我在过去一天创建了一个自己的 Hexdump 库,并验证了 atob 实际上工作正常。您的库的 md5sum 算法似乎与 UNIX/PHP 中的不同。当我有更多时间时,我可能会更深入地挖掘它。
【解决方案2】:

我可能误解了这个问题,但如果我不是,我以前遇到过这样的事情。您使用的 javascript 库不执行二进制操作。 php 编码的内容将是一堆 1 和 0,但 javascript 吐出的内容将是文本。如果您想要一个二进制字符串,您必须将结果文本转换为二进制,那么它应该与您的原始文件相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2017-07-14
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多