我如何在Javascript中base64编码数据(不是字符串)?

时间:2011-07-08 01:20:47

标签: javascript iphone encoding base64

我将功能从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中对string对象进行base64编码时,我得到了这个结果:

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

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

3 个答案:

答案 0 :(得分:3)

在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="

答案 1 :(得分:0)

您需要将原始十六进制字符串作为整数列表读取。见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。

如果我以后有时间,我会看看是否可以编写代码。

答案 2 :(得分:0)

搜索toDataUrl()函数