Mam skrypt PHP, który może kodować obraz PNG do ciągu Base64.
Chciałbym zrobić to samo za pomocą JavaScript. Wiem, jak otwierać pliki, ale nie jestem pewien, jak wykonać kodowanie. Nie jestem przyzwyczajony do pracy z danymi binarnymi.
javascript
base64
Nazwa Użytkownika
źródło
źródło
Odpowiedzi:
Możesz używać
btoa()
iatob()
konwertować na i z kodowania base64.Wydaje się, że w komentarzach jest pewne zamieszanie dotyczące tego, co te funkcje akceptują / zwracają, więc…
btoa()
akceptuje „ciąg”, w którym każdy znak reprezentuje 8-bitowy bajt - jeśli przekażesz ciąg zawierający znaki, których nie można przedstawić w 8 bitach, prawdopodobnie się zepsuje . Nie stanowi to problemu, jeśli faktycznie traktujesz ciąg znaków jako tablicę bajtów, ale jeśli próbujesz zrobić coś innego, najpierw musisz go zakodować.atob()
zwraca „ciąg”, gdzie każdy znak reprezentuje 8-bitowy bajt - to znaczy, że jego wartość będzie zawierać się między0
a0xff
. Ten sposób nie oznacza, że jest ASCII - prawdopodobnie jeśli używasz tej funkcji w ogóle, można oczekiwać, aby pracować z danych binarnych, a nie tekst.Zobacz też:
źródło
btoa(unescape(encodeURIComponent(str))))
jeśli str to UFT8Stąd :
Ponadto wyszukiwanie w „kodowaniu javascript base64” zmienia wiele innych opcji, powyższa była pierwsza.
źródło
string = string.replace(/\r\n/g,"\n");
instrukcję w metodzie kodowania utf8.string = string.replace(/\r\n/g,"\n");
, lol. To tak, jakby „och, zakodujmy ten ciąg, ale po pierwsze, dlaczego po prostu losowo nie znormalizujemy wszystkich podziałów linii bez żadnego dobrego powodu”. Należy to absolutnie usunąć z klasy w każdych okolicznościach.enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
. W mojej przeglądarce działa to dobrze,NaN>>4
równa się 0, ale nie wiem, czy wszystkie przeglądarki to robią (NaN/16
równa się NaN).Internet Explorer 10+
Przeglądarka
jsFiddle
z Node.js
Oto jak kodować normalny tekst do base64 w Node.js:
A oto jak dekodujesz ciągi zakodowane w base64:
z Dojo.js
Aby zakodować tablicę bajtów przy użyciu dojox.encoding.base64:
Aby zdekodować ciąg zakodowany w standardzie base64:
altana zainstalować kątowy-base64
źródło
Kod Sunny jest świetny, z wyjątkiem tego, że psuje się w IE7 z powodu odniesień do „this”. Naprawiono przez zastąpienie takich odniesień „Base64”:
źródło
Możesz użyć
btoa
(do base-64) iatob
(od base-64).W przypadku przeglądarki IE 9 i starszej wypróbuj wtyczkę jquery-base64 :
źródło
base64.encode(...)
ibase64.decode(...)
... dołączenie go do jQuery, gdy ma zerową funkcjonalność jQuery, nie ma absolutnie żadnego sensu ...Od komentarzy (przez SET i Stefana Steigera) poniżej zaakceptowanej odpowiedzi, oto krótkie podsumowanie, jak kodować / dekodować ciąg znaków do / z base64 bez potrzeby biblioteki.
Próbny
(używa biblioteki jQuery, ale nie do kodowania / dekodowania)
Pokaż fragment kodu
źródło
Buffer.from(b64data, 'base64').toString();
W obu implementacjach jest kilka błędów
_utf8_decode
.c1
ic2
są przypisywane jako zmienne globalne z powodu niewłaściwego użyciavar
instrukcji ic3
nie są w ogóle inicjowane ani deklarowane.Działa, ale zmienne te zastąpią wszystkie istniejące o tej samej nazwie poza tą funkcją.
Oto wersja, która tego nie zrobi:
źródło
Dałem +1 odpowiedzi Sunny, ale chciałem przekazać kilka zmian, które wprowadziłem dla mojego projektu, na wypadek gdyby ktoś uznał to za przydatne. Zasadniczo właśnie wyczyściłem trochę oryginalny kod, więc JSLint nie narzeka tak bardzo, a metody oznaczyłem jako prywatne w komentarzach jako prywatne. Dodałem także dwie metody, których potrzebowałem w swoim własnym projekcie, a mianowicie
decodeToHex
iencodeFromHex
.Kod:
źródło
Nowsze przeglądarki kodują Uint8Array na ciąg znaków i dekodują ciąg na Uint8Array.
W przypadku Node.js możesz użyć następujących poleceń do kodowania łańcucha, bufora lub Uint8Array do łańcucha i dekodowania z łańcucha, bufora lub Uint8Array do bufora.
źródło
Aby uczynić kod URL ciągiem kodowanym w Base64 przyjaznym, w JavaScript możesz zrobić coś takiego:
Zobacz także ten Fiddle: http://jsfiddle.net/magikMaker/7bjaT/
źródło
encodeURIComponent
może przynieść lepszy wynik przy mniejszym nakładzie pracy dewelopera.Pamiętaj, że nie jest to odpowiednie dla nieprzetworzonych ciągów znaków Unicode! Zobacz sekcję Unicode tutaj .
Składnia do kodowania
var encodedData = window.btoa(stringToEncode);
Składnia do dekodowania
var decodedData = window.atob(encodedData);
źródło
Ponownie napisałem ręcznie, te metody kodowania i dekodowania, z wyjątkiem metody szesnastkowej, na modułowy format dla kompatybilności między platformami / przeglądarkami, a także z rzeczywistym prywatnym zasięgiem, oraz zastosowań
btoa
iatob
jeśli istnieją ze względu na szybkość, a nie wykorzystanie własne kodowanie:https://gist.github.com/Nijikokun/5192472
Stosowanie:
źródło
To pytanie i jego odpowiedzi wskazały mi właściwy kierunek.
Zwłaszcza z Unicode atob i btoa nie mogą być używane jako „wanilia”, a obecnie WSZYSTKO jest Unicode.
Bezpośrednio z Mozilli, dwie ładne funkcje do tego celu (przetestowane z tagami Unicode i HTML)
Funkcje te wykonają błyskawicznie w porównaniu do surowego dekodowania base64 przy użyciu niestandardowej funkcji javascript, ponieważ btoa i atob są wykonywane poza interpreterem.
Jeśli możesz zignorować stare IE i stare telefony komórkowe (jak iPhone 3?), Powinno to być dobre rozwiązanie.
źródło
jeśli chcesz zakodować obiekt obrazu HTML, możesz napisać prostą funkcję, taką jak:
Aby uzyskać base64 obrazu według identyfikatora:
więcej tutaj
źródło
Współtworzenie zminimalizowanego wypełnienia dla
window.atob
+window.btoa
, którego obecnie używam.źródło
Wolę używać metod kodowania / dekodowania bas64 z CryptoJS , najpopularniejszej biblioteki standardowych i bezpiecznych algorytmów kryptograficznych zaimplementowanych w JavaScript z wykorzystaniem najlepszych praktyk i wzorców.
źródło
Oto wersja AngularJS Factory @ user850789:
źródło
Potrzebowałem kodowania ciągu UTF-8 jako base64 dla mojego projektu. Większość odpowiedzi tutaj nie wydaje się poprawnie obsługiwać par zastępczych UTF-16 podczas konwersji na UTF-8, więc, ze względu na zakończenie, opublikuję moje rozwiązanie:
Pamiętaj, że kod nie jest dokładnie testowany. Testowałem niektóre dane wejściowe, w tym rzeczy takie jak
strToUTF8Base64('衠衢蠩蠨')
i porównywałem z danymi wyjściowymi internetowego narzędzia do kodowania ( https://www.base64encode.org/ ).źródło
W moim projekcie nadal muszę obsługiwać IE7 i pracować z dużymi danymi wejściowymi do kodowania.
Na podstawie kodu zaproponowanego przez Joe Dyndale i zgodnie z sugestią Mariusa możliwe jest poprawienie wydajności w IE7 poprzez skonstruowanie wyniku za pomocą tablicy zamiast łańcucha.
Oto przykład kodowania:
źródło
Trochę więcej pracy, ale jeśli potrzebujesz wysokowydajnego rozwiązania natywnego, możesz skorzystać z niektórych funkcji HTML5.
Jeśli możesz wprowadzić swoje dane do
Blob
, możesz użyć funkcji FileReader.readAsDataURL (), aby uzyskaćdata://
adres URL i odciąć jego przód, aby uzyskać dane base64.Może być jednak konieczne dalsze przetwarzanie w celu urldecode danych, ponieważ nie jestem pewien, czy
+
znaki są znakami ucieczki, czy nie dladata://
adresu URL, ale powinno to być dość trywialne.źródło
Cóż, jeśli używasz dojo, daje nam to bezpośredni sposób kodowania lub dekodowania do base64.
Spróbuj tego:-
Aby zakodować tablicę bajtów przy użyciu dojox.encoding.base64:
Aby zdekodować ciąg zakodowany w standardzie base64:
źródło
Możesz użyć
window.btoa
iwindow.atob
...Prawdopodobnie wykorzystując sposób, jaki jest MDN, najlepiej wykonasz swoją pracę ... Akceptując także Unicode ... używając tych dwóch prostych funkcji:
źródło
Oto LIVE DEMO od
atob()
ibtoa()
JS wbudowanych funkcji:źródło
Użyj biblioteki js-base64 jako
źródło