Как мне base64 кодировать данные (не строку) в Javascript? - PullRequest
5 голосов
/ 08 июля 2011

Я портирую функциональность из приложения 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

Когда я base64 кодирую строковый объект в javascript, я получаю такой результат:

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

Проблема в том, что веб-сервис, на который я отправляю сообщение, не хочет зашифрованной строки base64, ему нужны зашифрованные данные base64! Как я могу сделать это в JavaScript?

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Преобразование шестнадцатеричной строки перед кодировкой 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="
0 голосов
/ 08 июля 2011

поиск функции toDataUrl ()

0 голосов
/ 08 июля 2011

Вам нужно прочитать исходную шестнадцатеричную строку как список целых чисел.См. Как преобразовать десятичное в шестнадцатеричное в JavaScript?

Затем вам нужно изменить один из многих алгоритмов base64 js, чтобы использовать целые числа вместо charCodeAt .См. http://www.webtoolkit.info/javascript-base64.html Также см. http://www.codeproject.com/KB/cs/base64encoder.aspx, которое является прямым целым числом для алгоритма base64 (большинство - байты или строки для base64).

Несмотря на то, что в последнем примере C # вы сможетепреобразовать его в JS.

Если у меня будет время позже, я посмотрю, смогу ли я написать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...