Saya memiliki skrip PHP yang dapat menyandikan gambar PNG ke string Base64.
Saya ingin melakukan hal yang sama menggunakan JavaScript. Saya tahu cara membuka file, tetapi saya tidak yakin bagaimana melakukan encoding. Saya tidak terbiasa bekerja dengan data biner.
javascript
base64
nama pengguna
sumber
sumber
Jawaban:
Anda dapat menggunakan
btoa()
danatob()
untuk mengkonversi ke dan dari pengkodean base64.Tampaknya ada beberapa kebingungan dalam komentar mengenai apa fungsi ini diterima / dikembalikan, jadi ...
btoa()
menerima "string" di mana setiap karakter mewakili byte 8-bit - jika Anda melewatkan string yang mengandung karakter yang tidak dapat direpresentasikan dalam 8 bit, itu mungkin akan rusak . Ini bukan masalah jika Anda benar-benar memperlakukan string sebagai array byte, tetapi jika Anda mencoba melakukan sesuatu yang lain maka Anda harus menyandikannya terlebih dahulu.atob()
mengembalikan "string" di mana setiap karakter mewakili byte 8-bit - yaitu, nilainya akan berada di antara0
dan0xff
. Ini tidak berarti itu ASCII - mungkin jika Anda menggunakan fungsi ini sama sekali, Anda berharap dapat bekerja dengan data biner dan bukan teks.Lihat juga:
sumber
btoa(unescape(encodeURIComponent(str))))
jika str adalah UFT8Dari sini :
Juga, pencarian pada "javascript base64 encoding" ternyata banyak pilihan lain, di atas adalah yang pertama.
sumber
string = string.replace(/\r\n/g,"\n");
pernyataan yang dipertanyakan dalam metode pengkodean utf8.string = string.replace(/\r\n/g,"\n");
di tempat pertama, lol. Ini seperti "oh, mari kita enkode string ini, tetapi pertama-tama, mengapa kita tidak menormalisasi semua baris secara acak tanpa alasan yang baik sama sekali". Itu benar-benar harus dikeluarkan dari kelas dalam semua keadaan.enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
. Di browser saya ini berfungsi dengan baik,NaN>>4
sama dengan 0, tapi saya tidak tahu apakah semua browser melakukan ini (juga,NaN/16
sama dengan NaN).Internet Explorer 10+
Lintas browser
jsFiddle
dengan Node.js
Inilah cara Anda menyandikan teks normal ke base64 di Node.js:
Dan di sini adalah bagaimana Anda mendekodekan string yang disandikan base64:
dengan Dojo.js
Untuk menyandikan larik byte menggunakan dojox.encoding.base64:
Untuk mendekode string yang disandikan base64:
bower instal angular-base64
sumber
Kode Sunny sangat bagus kecuali rusak di IE7 karena referensi ke "ini". Diperbaiki dengan mengganti referensi tersebut dengan "Base64":
sumber
Anda dapat menggunakan
btoa
(ke basis-64) danatob
(dari basis-64).Untuk IE 9 dan di bawah, coba plugin jquery-base64 :
sumber
base64.encode(...)
danbase64.decode(...)
... melampirkannya ke jQuery ketika tidak memiliki fungsi spesifik jQuery sama sekali tidak masuk akal ...Dari komentar (oleh SET dan Stefan Steiger) di bawah jawaban yang diterima, berikut adalah ringkasan singkat tentang cara menyandikan / mendekode string ke / dari base64 tanpa perlu perpustakaan.
Demo
(menggunakan perpustakaan jQuery, tetapi tidak untuk encode / decode)
Tampilkan cuplikan kode
sumber
Buffer.from(b64data, 'base64').toString();
Ada beberapa bug di kedua implementasi
_utf8_decode
.c1
danc2
ditugaskan sebagai variabel global karena rusaknya penggunaanvar
pernyataan, danc3
tidak diinisialisasi atau dideklarasikan sama sekali.Ini berfungsi, tetapi variabel-variabel ini akan menimpa yang sudah ada dengan nama yang sama di luar fungsi ini.
Inilah versi yang tidak akan melakukan ini:
sumber
Saya memberi jawaban pada Sunny, tetapi saya ingin menyumbang kembali beberapa perubahan yang saya buat untuk proyek saya sendiri kalau-kalau ada orang yang menganggapnya berguna. Pada dasarnya saya baru saja membersihkan kode asli sedikit sehingga JSLint tidak banyak mengeluh, dan saya membuat metode yang ditandai sebagai pribadi dalam komentar sebenarnya pribadi. Saya juga menambahkan dua metode yang saya butuhkan dalam proyek saya sendiri, yaitu
decodeToHex
danencodeFromHex
.Kode:
sumber
Untuk browser yang lebih baru untuk menyandikan Uint8Array ke string, dan mendekode string ke Uint8Array.
Untuk Node.js Anda dapat menggunakan yang berikut ini untuk menyandikan string, Buffer, atau Uint8Array ke string, dan mendekode dari string, Buffer, atau Uint8Array ke Buffer.
sumber
Untuk membuat String64 yang dikodekan Base64 friendly, di JavaScript Anda bisa melakukan sesuatu seperti ini:
Lihat juga Fiddle ini: http://jsfiddle.net/magikMaker/7bjaT/
sumber
encodeURIComponent
dapat menghasilkan hasil yang unggul dengan pengeluaran usaha yang lebih sedikit dari pihak pengembang.Harap dicatat bahwa ini tidak cocok untuk string Unicode mentah! Lihat bagian Unicode di sini .
Sintaks untuk penyandian
var encodedData = window.btoa(stringToEncode);
Sintaks untuk decoding
var decodedData = window.atob(encodedData);
sumber
Saya telah menulis ulang dengan tangan, metode encoding dan decoding ini dengan pengecualian hexadecimal menjadi format modular untuk kompatibilitas lintas platform / browser dan juga dengan pelingkupan privat nyata, dan penggunaan
btoa
danatob
jika ada karena kecepatan daripada menggunakan encoding sendiri:https://gist.github.com/Nijikokun/5192472
Pemakaian:
sumber
Pertanyaan ini dan jawabannya mengarahkan saya ke arah yang benar.
Terutama dengan unicode atob dan btoa tidak dapat digunakan "vanilla" dan hari ini SEMUA adalah unicode ..
Langsung dari Mozilla, dua fungsi yang bagus untuk tujuan ini (diuji dengan tag unicode dan html di dalamnya)
Fungsi-fungsi ini akan melakukan kilat cepat dibandingkan dengan decoding base64 baku menggunakan fungsi javascript kustom karena btoa dan atob dieksekusi di luar interpreter.
Jika Anda dapat mengabaikan IE lama dan ponsel lama (seperti iphone 3?) Ini harus menjadi solusi yang baik.
sumber
jika Anda perlu menyandikan objek gambar HTML, Anda dapat menulis fungsi sederhana seperti:
Untuk mendapatkan base64 gambar dengan id:
lebih lanjut di sini
sumber
Berkontribusi dengan polyfill yang diperkecil untuk
window.atob
+window.btoa
yang saat ini saya gunakan.sumber
Saya lebih suka menggunakan metode encode / decode bas64 dari CryptoJS , perpustakaan paling populer untuk algoritma kriptografi standar dan aman yang diterapkan dalam JavaScript menggunakan praktik dan pola terbaik.
sumber
Ini adalah versi pabrik AngularJS dari @ user850789:
sumber
Saya perlu pengkodean string UTF-8 sebagai base64 untuk proyek saya. Sebagian besar jawaban di sini tampaknya tidak menangani pasangan pengganti UTF-16 dengan benar ketika dikonversi ke UTF-8 jadi, demi penyelesaian, saya akan memposting solusi saya:
Perhatikan bahwa kode ini tidak diuji secara menyeluruh. Saya menguji beberapa input, termasuk hal-hal seperti
strToUTF8Base64('衠衢蠩蠨')
dan dibandingkan dengan output alat encoding online ( https://www.base64encode.org/ ).sumber
Untuk proyek saya, saya masih perlu mendukung IE7 dan bekerja dengan input besar untuk menyandikan.
Berdasarkan kode yang diusulkan oleh Joe Dyndale dan seperti yang disarankan dalam komentar oleh Marius, adalah mungkin untuk meningkatkan kinerja dengan IE7 dengan membangun hasilnya dengan array bukan string.
Berikut ini contoh untuk penyandian:
sumber
Meskipun sedikit lebih banyak pekerjaan, jika Anda menginginkan solusi asli berkinerja tinggi, ada beberapa fungsi HTML5 yang dapat Anda gunakan.
Jika Anda dapat memasukkan data ke dalam
Blob
, maka Anda dapat menggunakan fungsi FileReader.readAsDataURL () untuk mendapatkandata://
URL dan memotong bagian depannya untuk mendapatkan data base64.Anda mungkin harus melakukan pemrosesan lebih lanjut untuk urldecode data, karena saya tidak yakin apakah
+
karakter lolos atau tidak untukdata://
URL, tetapi ini seharusnya cukup sepele.sumber
Nah, jika Anda menggunakan dojo, itu memberi kami cara langsung untuk menyandikan atau mendekode ke base64.
Coba ini:-
Untuk menyandikan larik byte menggunakan dojox.encoding.base64:
Untuk mendekode string yang disandikan base64:
sumber
Anda dapat menggunakan
window.btoa
danwindow.atob
...Mungkin menggunakan cara MDN dapat melakukan pekerjaan Anda dengan sebaik-baiknya ... Juga menerima unicode ... menggunakan dua fungsi sederhana ini:
sumber
Berikut ini adalah DEMO LANGSUNG dari
atob()
danbtoa()
JS dibangun pada fungsi:sumber
Gunakan perpustakaan js-base64 sebagai
sumber