2014-01-13 2 views
0

Я пытаюсь получить двоичные данные с моего сервера couchdb. Но я могу их использовать. Ответ содержит строку, которая содержит двоичные данные, но если я попытаюсь выполнить код в base64 с помощью функции btoa, функция даст мне эту ошибку:как преобразовать двоичные данные в base64 из вложений couchdb

Uncaught InvalidCharacterError: 'btoa' failed: строка, которая должна быть закодирована, содержит символы, находящиеся за пределами диапазона Latin1.

Я знаю, что я могу получить данные, напрямую закодированные в base64, но я не хочу.

$.ajax({ 
     url: "http://localhost:5984/testdb/7d9de7a8f2cab6c0b3409d4495000e3f/img", 
     headers: { 
       Authorization: 'Basic ' + btoa("name:password"), 
     }, 
     success: function(data){ 
      /*console.log(JSON.parse(jsonData)); 
      console.log(imageData);*/ 
      document.getElementById("immagine").src = "Data:image/jpg;base64," + btoa(data); 
      console.log(data); 
     } 
    }); 

любая идея?

ответ

0

Начните с осознанием того, что каждый символ в Base64 Струнный

var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'.split(''); 

представляет номер, в частности, от 0 к 63. Затем рассмотрим, что этот диапазон чисел - это все номера, которые вы можете записать с помощью 6 бит, и что мы обычно думаем о двоичных данных в байт которые 8 бит длиной.

Итак, теперь мы можем заключить, преобразование мы, чтобы достичь является 8 разрядных целых чисел в 6 битовые целые числа, который выглядит немного как этот

xxxxxx xxyyyy yyyyzz zzzzzz 

, где каждая буква описывает который байт бит в , а пробелы описывают разрывы между целыми числами 6.

После того, как мы имеем 6 разрядное число, мы можем просто преобразовать в полукокса и, наконец, добавить = признаки, если нам нужно указать число байтов не кратно 3 (и они не просто 0)

Итак, как мы это сделаем?

var arr8 = 'foobar'; // assuming binary string 

var i, // to iterate 
    s1, s2, s3, s4, // sixes 
    e1, e2, e3, // eights 
    b64 = ''; // result 
// some code I prepared earlier 
for (i = 0; i < arr8.length; i += 3) { 
    e1 = arr8[i ]; 
    e1 = e1 ? e1.charCodeAt(0) & 255 : 0; 
    e2 = arr8[i + 1]; 
    e2 = e2 ? e2.charCodeAt(0) & 255 : 0; 
    e3 = arr8[i + 2]; 
    e3 = e3 ? e3.charCodeAt(0) & 255 : 0; 
    // wwwwwwxx xxxxyyyy yyzzzzzz 
    s1 =      e1 >>> 2 ; 
    s2 = ((e1 & 3) << 4) + (e2 >>> 4); 
    s3 = ((e2 & 15) << 2) + (e3 >>> 6); 
    s4 = e3 & 63     ; 
    b64 += chars[s1] + chars[s2]; 
    if (arr8[i + 2] !== undefined) 
     b64 += chars[s3] + chars[s4]; 
    else if (arr8[i + 1] !== undefined) 
     b64 += chars[s3] + '='; 
    else 
     b64 += '=='; 
} 
// and the result 
b64; // "Zm9vYmFy" 
+0

функция btoa, которую я использую, хорошо работает. имя строки: пароль правильно закодирован. Я думаю, что проблема заключается в данных, которые я получаю с сервера couchdb. – Morris

+0

@Morris 'btoa' не является бинарным, поэтому вы должны написать пользовательский номер –

+0

. но, тем не менее, ваш код не работает. base64, который я получаю с вашим кодом, не совпадает с исходным изображением. – Morris

Смежные вопросы