如何在Javascript中对数据(而不是字符串)进行base64编码?

如何在Javascript中对数据(而不是字符串)进行base64编码?,javascript,iphone,encoding,base64,Javascript,Iphone,Encoding,Base64,我正在将Objective-C iPhone应用程序的功能移植到Javascript iPhone应用程序(Appcelerator)。在Objective-C中,我有一个表示此令牌的NSData对象: //NSData object printed to the console: <0cd9f571 b0e66e6d ca410d12 f67a404a 7e64b9b5 d2483fd9 63a9267b 1c7609e2> 在我的javascript实现中,我有一个相同令牌的字

我正在将Objective-C iPhone应用程序的功能移植到Javascript iPhone应用程序(Appcelerator)。在Objective-C中,我有一个表示此令牌的NSData对象:

//NSData object printed to the console:
<0cd9f571 b0e66e6d ca410d12 f67a404a 7e64b9b5 d2483fd9 63a9267b 1c7609e2>
在我的javascript实现中,我有一个相同令牌的字符串表示。看起来是这样的:

//string version of the token in my javascript implementation
0cd9f571b0e66e6dca410d12f67a404a7e64b9b5d2483fd963a9267b1c7609e2
当我用javascript对字符串对象进行base64编码时,我得到以下结果:

//base64 encoded NSData object
DNn1cbDmbm3KQQ0S9npASn5kubXSSD/ZY6kmexx2CeI=
//base64 encoded token (string) in javascript
MGNkOWY1NzFiMGU2NmU2ZGNhNDEwZDEyZjY3YTQwNGE3ZTY0YjliNWQyNDgzZmQ5NjNhOTI2N2IxYzc2MDllMg==

问题是,我发布到的web服务不需要base64编码的字符串,它需要base64编码的数据!如何在javascript中执行此操作?

您需要将原始十六进制字符串读取为整数列表。看

然后,您需要修改众多base64 js算法中的一个,以使用整数而不是charCodeAt。看见 还要查看哪个是base64 algo的直接整数(大多数是base64的字节或字符串)

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


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

搜索toDataUrl()函数

在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('');
}
(其中是一些浏览器提供的base64编码函数)结果

"DNn1cbDmbm3KQQ0S9npASn5kubXSSD/ZY6kmexx2CeI="
“DNN1CDBMBM3KQ0S9NPASN5KUBXSSD/ZY6kmexx2CeI=”0cd9f571b0e66e6dca410d12f67a404a7e64b9b5d2483fd963a9267b1c7609e2 base64不是已经编码了吗?从表面上看,我认为是的is@TheBrain:这是一个十六进制数。换句话说,它是Base16编码的。修改base64编码器是没有必要的。您可以使用
parseInt(516;,16)
将十六进制字符串转换为包含二进制数据的字符串,然后将其传递给base64编码器。使用合适的
Array.prototype.map
,一个简单的
hexstr.match(/../g).map(函数(x){return String.fromCharCode(parseInt(x,16))}).join(“”)
就可以了。 "DNn1cbDmbm3KQQ0S9npASn5kubXSSD/ZY6kmexx2CeI="