Czy są jakieś metody w JavaScript, które mogłyby być użyte do kodowania i dekodowania łańcucha przy użyciu kodowania base64?
javascript
base64
Mo.
źródło
źródło
Odpowiedzi:
Niektóre przeglądarki, takie jak Firefox, Chrome, Safari, Opera i IE10 +, mogą obsługiwać Base64 natywnie. Spójrz na to pytanie Stackoverflow . To używa
btoa()
iatob()
funkcje .W przypadku JavaScript po stronie serwera (węzeł) można użyć
Buffer
s do dekodowania.Jeśli szukasz rozwiązania dla różnych przeglądarek, istnieją biblioteki takie jak CryptoJS lub kod:
http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html
W tym drugim przypadku musisz dokładnie przetestować tę funkcję pod kątem zgodności z różnymi przeglądarkami. Błąd został już zgłoszony .
źródło
new Buffer('Hello, world!').toString('base64');
new Buffer('SGVsbG8sIHdvcmxkIQ==', 'base64').toString('ascii');
(źródło)new Buffer(string)
jest przestarzałe.Buffer.from(jwt.split('.')[1], 'base64').toString()
W przeglądarkach opartych na Gecko / WebKit (Firefox, Chrome i Safari) oraz Opera można używać btoa () i atob () .
Oryginalna odpowiedź: jak możesz zakodować ciąg znaków w Base64 w JavaScript?
źródło
Internet Explorer 10+
Przeglądarka
Ponownie napisane i zmodularyzowane biblioteki / moduły kodowania i dekodowania JavaScript UTF-8 i Base64 dla AMD, CommonJS, Nodejs i przeglądarek. Kompatybilny z wieloma przeglądarkami.
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
Ale jak?
Jeśli chcesz dowiedzieć się więcej o tym, jak ogólnie kodowane jest base64, aw szczególności w JavaScript, polecam ten artykuł: Informatyka w JavaScript: kodowanie Base64
źródło
c2
a prawdopodobniec1
ic3
tak nie będzie działać z"use strict"
jak zdefiniowano powyżej.Oto zaostrzona wersja postu Snajpera. Zakłada dobrze uformowany ciąg base64 bez powrotu karetki. Ta wersja eliminuje kilka pętli, dodaje
&0xff
poprawkę z Jarosławia, eliminuje końcowe null oraz odrobinę golfa kodu.źródło
decodeBase64=function(f){var g={},b=65,d=0,a,c=0,h,e="",k=String.fromCharCode,l=f.length;for(a="";91>b;)a+=k(b++);a+=a.toLowerCase()+"0123456789+/";for(b=0;64>b;b++)g[a.charAt(b)]=b;for(a=0;a<l;a++)for(b=g[f.charAt(a)],d=(d<<6)+b,c+=6;8<=c;)((h=d>>>(c-=8)&255)||a<l-2)&&(e+=k(h));return e};
var g={},k=String.fromCharCode,i;for(i=0;i<64;)g[k(i>61?(i&1)*4|43:i+[65,71,-4][i/26&3])]=i++;
Krótka i szybka funkcja dekodowania JavaScript Base64 bez Failsafe:
źródło
https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22
źródło
Projekt php.js ma implementacje JavaScript wielu funkcji PHP.
base64_encode
ibase64_decode
są uwzględnione.źródło
Czy ktoś powiedział kod golfa? =)
Oto moja próba poprawienia mojego upośledzenia podczas nadrabiania zaległości. Dostarczone dla Twojej wygody.
To, czego właściwie szukałem, to implementacja asynchroniczna i ku mojemu zaskoczeniu okazuje się,
forEach
że w przeciwieństwie do$([]).each
implementacji metody JQuery jest bardzo synchroniczna.Jeśli miałeś na myśli również takie zwariowane pojęcia, opóźnienie 0
window.setTimeout
uruchomi asynchronicznie dekodowanie base64 i wykona funkcję zwrotną z wynikiem po zakończeniu.@Toothbrush zasugerował „zindeksować ciąg znaków jak tablicę” i pozbyć się
split
. Ta rutyna wydaje się naprawdę dziwna i nie jestem pewna, jak będzie kompatybilna, ale uderza innego ptaszka, więc niech to zostanie.Próbując znaleźć więcej informacji na temat ciągu JavaScript jako tablicy, natknąłem się na tę profesjonalną wskazówkę za pomocą
/./g
wyrażenia regularnego, aby przejść przez ciąg. To jeszcze bardziej zmniejsza rozmiar kodu, zastępując ciąg znaków na miejscu i eliminując potrzebę utrzymywania zmiennej zwracanej.Jeśli jednak szukasz czegoś bardziej tradycyjnego, być może podoba Ci się coś więcej.
Nie miałem problemu z końcową wartością zerową, więc został on usunięty, aby pozostać poniżej normy, ale powinien być łatwo rozwiązany za pomocą a
trim()
lub a,trimRight()
jeśli wolisz, jeśli stanowi to dla ciebie problem.to znaczy.
Uwaga:
Wynikiem jest ciąg bajtów ascii, jeśli potrzebujesz Unicode, najłatwiejszy jest
escape
ciąg bajtów, który można następnie zdekodować wdecodeURIComponent
celu utworzenia łańcucha Unicode.Ponieważ
escape
jest on przestarzały, możemy zmienić naszą funkcję, aby obsługiwała Unicode bezpośrednio, bez potrzebyescape
lubString.fromCharCode
możemy wygenerować%
ciąg znaków ucieczki gotowy do dekodowania URI.nJoy!
źródło
split
Ciąg nie jest potrzebny , ponieważ można indeksować ciąg JavaScript jak tablicę.s.split('').forEach(function ...
można zastąpić[].forEach.call(s, function ...
. Powinno być znacznie szybsze, ponieważ nie musi on dzielić struny.Próbowałem procedur JavaScript w phpjs.org i działały dobrze.
Najpierw wypróbowałem procedury sugerowane w wybranej odpowiedzi Ranhiru Cooray - http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html
Odkryłem, że nie działały one we wszystkich okolicznościach. Napisałem przypadek testowy, w którym te procedury się nie powiodły, i opublikowałem je w GitHub pod adresem:
https://github.com/scottcarter/base64_javascript_test_data.git
Wysłałem również komentarz do posta na blogu w witrynie ntt.cc, aby ostrzec autora (w oczekiwaniu na moderację - artykuł jest stary, więc nie jestem pewien, czy komentarz zostanie opublikowany).
ź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
W Node.js możemy to zrobić w prosty sposób
źródło
W przypadku frameworków JavaScript, w których nie ma
atob
metody i jeśli nie chcesz importować bibliotek zewnętrznych, jest to krótka funkcja, która to robi.Otrzymałby ciąg zawierający wartość zakodowaną w Base64 i zwrócił zdekodowaną tablicę bajtów (gdzie tablica bajtów jest reprezentowana jako tablica liczb, gdzie każda liczba jest liczbą całkowitą od 0 do 255 włącznie).
Wykorzystane zasoby: RFC-4648 Sekcja 4
źródło