我正在将功能从Objective-C iPhone应用程序移植到Javascript iPhone应用程序(Appcelerator Titanium)。在Objective-C中,我有一个表示该 token 的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中做到这一点?
最佳答案
在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 =”