【问题标题】:How do I base64 encode data (not a string) in Javascript?如何在 Javascript 中对数据(不是字符串)进行 base64 编码?
【发布时间】:2011-07-08 01:20:47
【问题描述】:

我正在将功能从 Objective-C iPhone 应用程序移植到 Javascript iPhone 应用程序 (Appcelerator Titanium)。在 Objective-C 中,我有一个 NSData 对象来表示这个标记:

//NSData object printed to the console:
<0cd9f571 b0e66e6d ca410d12 f67a404a 7e64b9b5 d2483fd9 63a9267b 1c7609e2>

它不是一个字符串,它是一个 NSData 对象——一个字节缓冲区的面向对象的包装器。当我对对象进行base64编码时,我得到了这个结果:

//base64 encoded NSData object
DNn1cbDmbm3KQQ0S9npASn5kubXSSD/ZY6kmexx2CeI=

在我的 javascript 实现中,我有一个相同标记的字符串表示形式。它看起来像这样:

//string version of the token in my javascript implementation
0cd9f571b0e66e6dca410d12f67a404a7e64b9b5d2483fd963a9267b1c7609e2

当我在 javascript 中对字符串对象进行 base64 编码时,我得到以下结果:

//base64 encoded token (string) in javascript
MGNkOWY1NzFiMGU2NmU2ZGNhNDEwZDEyZjY3YTQwNGE3ZTY0YjliNWQyNDgzZmQ5NjNhOTI2N2IxYzc2MDllMg==

问题是,我发布到的 Web 服务不需要 base64 编码的字符串,它需要 base64 编码的数据!我怎样才能在 javascript 中做到这一点?

【问题讨论】:

  • 0cd9f571b0e66e6dca410d12f67a404a7e64b9b5d2483fd963a9267b1c7609e2 base64 不是已经编码了吗?从它的外观我认为它是
  • @TheBrain:这是一个十六进制数。换句话说,它是 base 16 编码的。

标签: javascript iphone encoding base64


【解决方案1】:

在base64编码之前转换十六进制字符串应该可以解决问题。在 JS 中执行此操作:

if (! Array.prototype.map) {
    Array.prototype.map = function(f) {
        var result = [];
        for (var i=0; i < this.length; ++i) {
            result[i] = f(this[i], i);
        }
        return result;
    }
}
String.prototype.b16decode = function() {
    return this.match(/../g).map(
        function (x) {
            return String.fromCharCode(parseInt(x, 16));
        }
    ).join('');
}

比如跑步

btoa('0cd9f571b0e66e6dca410d12f67a404a7e64b9b5d2483fd963a9267b1c7609e2'.b16decode())

(其中btoa 是一些浏览器提供的base64 编码函数)导致

"DNn1cbDmbm3KQQ0S9npASn5kubXSSD/ZY6kmexx2CeI="

【讨论】:

    【解决方案2】:

    您需要将原始十六进制字符串读取为整数列表。见How to convert decimal to hex in JavaScript?

    然后您需要修改许多 base64 js 算法中的一种以使用整数而不是 charCodeAt。见http://www.webtoolkit.info/javascript-base64.html 另请参阅http://www.codeproject.com/KB/cs/base64encoder.aspx,它是 base64 算法的直接整数(大多数是 base64 的字节或字符串)。

    即使最后一个示例 C#,您也应该能够将其转换为 JS。

    以后有时间我看看能不能写代码。

    【讨论】:

    • 不需要修改 base64 编码器。可以使用parseInt(_, 16) 将十六进制字符串转换为包含二进制数据的字符串,然后将其传递给base64 编码器。有了合适的Array.prototype.map,一个简单的hexstr.match(/../g).map(function (x) {return String.fromCharCode(parseInt(x, 16))}).join('') 就可以了。
    【解决方案3】:

    搜索 toDataUrl() 函数

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2011-12-03
      • 2012-10-26
      相关资源
      最近更新 更多