Potrzebuję wydajnego (czytanego natywnego) sposobu na konwersję ciągu ArrayBuffer
na base64, który musi być użyty na postie wieloczęściowej.
javascript
encoding
base64
arraybuffer
zaheer
źródło
źródło
join()
ich na końcu jest znacznie szybsze w Firefox, IE i Safari (ale znacznie wolniej w Chrome): jsperf.com/tobase64-implementationsFailed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
To działa dobrze dla mnie:
W ES6 składnia jest nieco prostsza:
Jak wskazano w komentarzach, ta metoda może powodować błąd czasu wykonywania w niektórych przeglądarkach, gdy
ArrayBuffer
jest ona duża. Dokładny limit rozmiaru jest w każdym przypadku zależny od implementacji.źródło
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
jest bezpieczny dla znaków w zakresie kodu 0-255, ponieważ tak jest w tym przypadku (Pomyśl o 8 calachUint8Array
).Dla tych, którzy lubią to krótko, oto inne użycie,
Array.reduce
które nie spowoduje przepełnienia stosu:źródło
<amount of Bytes in the buffer>
nowe ciągi.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Istnieje inny asynchroniczny sposób użycia obiektów Blob i FileReader.
Nie testowałem wydajności. Ale to inny sposób myślenia.
źródło
dataurl.split(',', 2)[1]
zamiastdataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
teoretycznie może zwrócić procentowo zakodowane daneURI (i wygląda na to, że tak naprawdę jest w jsdom )split
lepszy niżsubstring
?Użyłem tego i działa dla mnie.
źródło
Zalecam, aby NIE używać natywnych
btoa
strategii - ponieważ nie kodują one poprawnie wszystkichArrayBuffer
…przepisz DOMs atob () i btoa ()
Chociaż nigdy nie spotkałem się z tym dokładnym błędem, odkryłem, że wiele z nich
ArrayBuffer
, które próbowałem zakodować, zostało zakodowanych nieprawidłowo.Użyłbym rekomendacji MDN lub gist.
źródło
btoa
nie działa na String, ale OP pytaArrayBuffer
.źródło
Poniżej znajdują się 2 proste funkcje do konwersji Uint8Array na Base64 String iz powrotem
źródło
function
słowo kluczowe i powinno działać w nowoczesnej przeglądarce.Możesz uzyskać normalną tablicę
ArrayBuffer
za pomocąArray.prototype.slice
. Użyj funkcji takiej jakArray.prototype.map
konwersja bajtów na znaki ijoin
razem na ciąg znaków.Ta metoda jest szybsza, ponieważ nie ma w niej żadnych konkatenacji łańcuchów.
źródło
OP nie określił Środowiska Działającego, ale jeśli używasz Node.JS, istnieje bardzo prosty sposób na zrobienie czegoś takiego.
Zgodnie z oficjalnymi dokumentami Node.JS https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
Ponadto, jeśli pracujesz na przykład w Angular, klasa bufora zostanie również udostępniona w środowisku przeglądarki.
źródło
Javascript
. Zaktualizowałem więc odpowiedź, aby była bardziej zwięzła. Myślę, że to ważna odpowiedź, ponieważ szukałem, jak to zrobić i nie mogłem znaleźć najlepszej odpowiedzi na problem.Z mojej strony, korzystając z nawigatora Chrome, musiałem użyć DataView (), aby odczytać arrayBuffer
źródło
Jest to lepsze, jeśli używasz JSZip do rozpakowywania archiwum z ciągu
źródło