Làm thế nào bạn có thể mã hóa một chuỗi thành Base64 trong JavaScript?


810

Tôi có một đoạn mã PHP có thể mã hóa hình ảnh PNG thành chuỗi Base64.

Tôi muốn làm điều tương tự bằng JavaScript. Tôi biết cách mở tệp, nhưng tôi không chắc cách mã hóa. Tôi không quen làm việc với dữ liệu nhị phân.


2
Đây là cách tốt nhất để base64_encode và base64_decode sử dụng javascript. Xem các liên kết dưới đây. phpjs.org/fifts/base64_encode:58 phpjs.org/fifts/base64_decode:357
gautamlakum

đây là một plugin jquery khác cho mã hóa / giải mã cơ
sở64

Kiểm tra microjs: microjs.com/#base64
Vinod Srivastav

Câu trả lời:


866

Bạn có thể sử dụng btoa()atob()chuyển đổi sang và từ mã hóa base64.

Dường như có một số nhầm lẫn trong các ý kiến ​​liên quan đến những gì các chức năng này chấp nhận / trả lại, vì vậy, Lít

  • btoa()chấp nhận một chuỗi mã số nghiêm trọng, trong đó mỗi ký tự đại diện cho một byte 8 bit - nếu bạn truyền một chuỗi chứa các ký tự không thể được biểu thị trong 8 bit, nó có thể sẽ bị hỏng . Đây không phải là vấn đề nếu bạn thực sự coi chuỗi là một mảng byte, nhưng nếu bạn đang cố gắng làm điều gì khác thì bạn sẽ phải mã hóa nó trước.

  • atob()trả về một chuỗi mã số nghiêm trọng trong đó mỗi ký tự đại diện cho một byte 8 bit - nghĩa là giá trị của nó sẽ nằm giữa 00xff. Điều này không có nghĩa là ASCII - có lẽ nếu bạn đang sử dụng chức năng này, bạn sẽ làm việc với dữ liệu nhị phân chứ không phải văn bản.

Xem thêm:


47
Lưu ý rằng điều này cũng hoạt động cho các trình duyệt webkit, chẳng hạn như Safari.
Daniel Von Fange

5
nhưng nó không hoạt động trên iPhone3G với iOS 4.1. Nó hoạt động trên trình giả lập iPhone giả lập khi được đặt thành iPhone4 hoặc iPhone.
Cấp M

29
Vui lòng lưu ý việc xem xét đặc biệt cho các chuỗi Unicode: developer.mozilla.org/En/DOM/Window.btoa#Unicode_Strings btoa và atob chỉ hoạt động chính xác cho các chuỗi dựa trên ASCII. Là người Mỹ, bạn có thể sẽ không nhận thấy sự khác biệt ... nhưng lần đầu tiên bạn sử dụng ký tự có dấu, mã của bạn sẽ bị hỏng.
Dan Esparza

70
bạn nên sử dụng btoa(unescape(encodeURIComponent(str))))nếu str là UFT8
SET

4
Xem chỉnh sửa của tôi, @Triynko. Đây không phải là dự định được sử dụng để xử lý văn bản , thời gian.
Shog9

289

Từ đây :

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
var Base64 = {

// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode : function (input) {
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;

    input = Base64._utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output +
        this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
        this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

    }

    return output;
},

// public method for decoding
decode : function (input) {
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    while (i < input.length) {

        enc1 = this._keyStr.indexOf(input.charAt(i++));
        enc2 = this._keyStr.indexOf(input.charAt(i++));
        enc3 = this._keyStr.indexOf(input.charAt(i++));
        enc4 = this._keyStr.indexOf(input.charAt(i++));

        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;

        output = output + String.fromCharCode(chr1);

        if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
        }

    }

    output = Base64._utf8_decode(output);

    return output;

},

// private method for UTF-8 encoding
_utf8_encode : function (string) {
    string = string.replace(/\r\n/g,"\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

        var c = string.charCodeAt(n);

        if (c < 128) {
            utftext += String.fromCharCode(c);
        }
        else if((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }

    }

    return utftext;
},

// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while ( i < utftext.length ) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if((c > 191) && (c < 224)) {
            c2 = utftext.charCodeAt(i+1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else {
            c2 = utftext.charCodeAt(i+1);
            c3 = utftext.charCodeAt(i+2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }

    }

    return string;
}

}

Ngoài ra, tìm kiếm trên "mã hóa javascript base64" cho thấy rất nhiều tùy chọn khác, ở trên là lựa chọn đầu tiên.


3
Điều này cũng hữu ích khi mã hóa base64 không chuẩn; trong trường hợp của tôi, ký tự "/" không được sử dụng và "?" thay vào đó, ký tự được sử dụng, có nghĩa là ngay cả trong Chrome atob () sẽ không giải mã được chuỗi cơ sở64 đang đến.
Chris Moschini

21
Hãy cẩn thận với mã này - nó cố gắng diễn giải chuỗi của bạn dưới dạng chuỗi được mã hóa UTF-8. Chúng tôi đã có một trường hợp trong đó chúng tôi có một chuỗi nhị phân (tức là mỗi ký tự trong chuỗi nên được hiểu là một byte) và mã này đã làm hỏng dữ liệu. Đọc nguồn, Luke.
Daniel Yankowsky

11
Tất cả những gì cần thiết để làm cho nó an toàn cho hầu hết mã hóa / giải mã nhị phân để loại bỏ câu string = string.replace(/\r\n/g,"\n");lệnh nghi vấn trong phương thức mã hóa utf8.
Marius

7
@Marius: Tôi tự hỏi tại sao họ thậm chí sẽ bao gồm string = string.replace(/\r\n/g,"\n");ở vị trí đầu tiên, lol. Giống như "oh, hãy mã hóa chuỗi này, nhưng trước tiên, tại sao chúng ta không bình thường hóa ngẫu nhiên tất cả các ngắt dòng mà không có lý do chính đáng nào cả". Điều đó tuyệt đối nên được loại bỏ khỏi lớp trong mọi trường hợp.
Triynko

2
Tôi không phải là một chuyên gia javascript, nhưng mã này dường như có lỗi: nếu chr2 là NaN, giá trị của nó vẫn được sử dụng trong câu lệnh enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);. Trong trình duyệt của tôi, mọi thứ đều ổn, NaN>>4bằng 0, nhưng tôi không biết liệu tất cả các trình duyệt có làm điều này không (cũng NaN/16bằng NaN).
Jan

117

Internet Explorer 10+

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = btoa(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = atob(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

Qua trình duyệt

// Create Base64 Object
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = Base64.encode(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = Base64.decode(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

jsFiddle


với Node.js

Đây là cách bạn mã hóa văn bản bình thường thành base64 trong Node.js:

//Buffer() requires a number, array or string as the first parameter, and an optional encoding type as the second parameter. 
// Default is utf8, possible encoding types are ascii, utf8, ucs2, base64, binary, and hex
var b = new Buffer('JavaScript');
// If we don't use toString(), JavaScript assumes we want to convert the object to utf8.
// We can make it convert to other formats by passing the encoding type to toString().
var s = b.toString('base64');

Và đây là cách bạn giải mã các chuỗi được mã hóa base64:

var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
var s = b.toString();

với Dojo.js

Để mã hóa một mảng byte bằng cách sử dụng dojox.encoding.base64:

var str = dojox.encoding.base64.encode(myByteArray);

Để giải mã một chuỗi được mã hóa base64:

var bytes = dojox.encoding.base64.decode(str)

Bower cài đặt angular-base64

<script src="bower_components/angular-base64/angular-base64.js"></script>

angular
    .module('myApp', ['base64'])
    .controller('myController', [

    '$base64', '$scope', 
    function($base64, $scope) {

        $scope.encoded = $base64.encode('a string');
        $scope.decoded = $base64.decode('YSBzdHJpbmc=');
}]);

3
Câu trả lời này dựa trên mã gốc và KHÔNG bao gồm các cập nhật cho mã đó được đăng trong các câu trả lời khác tại đây.
Eugene Ryabtsev

Đề xuất giải pháp NodeJS không được chấp nhận.
Vladimir Nul

94

Mã của Sunny rất tuyệt ngoại trừ nó bị hỏng trong IE7 vì các tham chiếu đến "này". Đã sửa lỗi bằng cách thay thế các tham chiếu đó bằng "Base64":

var Base64 = {
// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode : function (input) {
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;

    input = Base64._utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output +
        Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
        Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);

    }

    return output;
},

// public method for decoding
decode : function (input) {
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    while (i < input.length) {

        enc1 = Base64._keyStr.indexOf(input.charAt(i++));
        enc2 = Base64._keyStr.indexOf(input.charAt(i++));
        enc3 = Base64._keyStr.indexOf(input.charAt(i++));
        enc4 = Base64._keyStr.indexOf(input.charAt(i++));

        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;

        output = output + String.fromCharCode(chr1);

        if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
        }

    }

    output = Base64._utf8_decode(output);

    return output;

},

// private method for UTF-8 encoding
_utf8_encode : function (string) {
    string = string.replace(/\r\n/g,"\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

        var c = string.charCodeAt(n);

        if (c < 128) {
            utftext += String.fromCharCode(c);
        }
        else if((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }

    }

    return utftext;
},

// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while ( i < utftext.length ) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if((c > 191) && (c < 224)) {
            c2 = utftext.charCodeAt(i+1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else {
            c2 = utftext.charCodeAt(i+1);
            c3 = utftext.charCodeAt(i+2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }

    }
    return string;
}
}

4
Thật tệ, tôi đã lấy đầu vào từ URL của trình duyệt; ở đâu | được chuyển đổi thành% 7C; do đó mã hóa cũng sai.
Kanagavelu Sugumar

Tôi biết điều này thực sự cũ, nhưng tôi đã thấy chức năng này được sử dụng ở nhiều nơi, chuỗi khóa thực sự là 65 ký tự, không phải 64. Chuỗi không phải là thông số kỹ thuật tiêu chuẩn, tôi không chắc nó có vấn đề gì không, nhưng chỉ là tự hỏi nếu nó không?
Jonathan Wagner

"Sử dụng nghiêm ngặt"; là những gì phá vỡ 'cái này' và các yếu tố loại khác như 'với' và từ những gì tôi đã đọc, 'eval' bị va chạm. Tất cả các ý tưởng thất lạc về lạm dụng. Cá nhân tôi không thấy lý do tại sao JavaScript cần đi theo lộ trình của nó, nó không bao giờ có nghĩa là một chương trình bị ràng buộc chặt chẽ và làm cho phức tạp hơn nó đã có. Nếu bạn muốn bị ràng buộc thì hãy tạo một trình biên dịch cho javascript.
Đánh dấu Giblin

Tôi cố gắng sử dụng chức năng này và tôi nhận được lỗi: Nguyên nhân bởi: org.mozilla.javascript.EcmaError: TypeError: Không thể tìm thấy chức năng thay thế trong đối tượng teste teste Tôi đang cố mã hóa .txt bằng "teste teste teste". Bất cứ ai cũng biết tại sao lỗi này?
PRVS 04/11/2015

@JonathanWagner - có 64 ký tự được sử dụng cho mã hóa thông thường. Ký tự thứ 65 được sử dụng làm phần đệm cho chúng, chuỗi đầu vào không có số lượng ký tự chia hết cho 3.
Khởi động

90

Bạn có thể sử dụng btoa(đến cơ sở-64) và atob(từ cơ sở-64).

Đối với IE 9 trở xuống, hãy thử plugin jquery-base64 :

$.base64.encode("this is a test");
$.base64.decode("dGhpcyBpcyBhIHRlc3Q=");

133
Tại sao mọi thứ cần phải là một plugin jQuery: c đây chỉ là chức năng JavaScript cốt lõi, điều này không liên quan gì đến DOM hoặc jQuery
EaterOfCode

38
Đây không phải là một chức năng cốt lõi hoặc sẽ không có nhiều câu trả lời được bình chọn cao khác nhau (bao gồm cả mã tự làm tl; dr code). Vì vậy, imho đây thực sự là một trường hợp sử dụng tốt cho jQuery (một lớp lót, dự kiến ​​sẽ hoạt động ngay cả trong WebView của Android) - thậm chí nhiều hơn nếu nó đã là một phụ thuộc.
Risadinha

1
Tôi thích cài đặt các đoạn mã như thế này vào jQuery chủ yếu vì chúng sẽ tồn tại trong một không gian tên được kiểm soát. Nếu bạn không sử dụng AMD hoặc CommonJS hoặc một mẫu thiết kế tương tự, không gian tên toàn cầu của bạn sẽ thực sự lộn xộn với một loạt các chức năng ngẫu nhiên.
sffc

9
@Risadinha - ngoại trừ chức năng của nó hoàn toàn không phụ thuộc hay mở rộng bất cứ thứ gì jQuery ... nghĩa đen là các tham chiếu duy nhất đến jQuery trong mã của nó đang gắn nó vào đối tượng jQuery ... Sử dụng jQuery? Chỉ cần biến nó thành 1 lớp lót base64.encode(...)base64.decode(...)... gắn nó vào jQuery khi nó không có chức năng cụ thể của jQuery sẽ hoàn toàn vô nghĩa ...
Jimbo Jonny

1
jQuery không được yêu cầu. Không phải là một câu trả lời hợp lệ cho một câu hỏi JS cũ đơn giản.
metaColin

34

Từ các ý kiến ​​(của SET và Stefan Steiger) bên dưới câu trả lời được chấp nhận, đây là tóm tắt nhanh về cách mã hóa / giải mã chuỗi thành / từ cơ sở64 mà không cần thư viện.

str = "The quick brown fox jumps over the lazy dog";
b64 = btoa(unescape(encodeURIComponent(str)));
str = decodeURIComponent(escape(window.atob(b64)));

Bản giới thiệu

(sử dụng thư viện jQuery, nhưng không phải để mã hóa / giải mã)


Để xác nhận, điều này hỗ trợ các ký tự UTF-8?
Crashalot

1
@Crashalot Tôi nhận ra đây là hai năm quá muộn, nhưng đúng vậy. Tôi cũng chỉ nhận ra khi tôi gõ cái này mà bạn đã cung cấp một bản chỉnh sửa có thể khiến UTF8 hoạt động.
tycrek

Đối với bất kỳ ai ở đây đang tìm kiếm một giải pháp tốt để sử dụng với Node.js, tôi có thể xác nhận điều này hoạt động. Để giải mã trong Node, tôi đã sử dụng:Buffer.from(b64data, 'base64').toString();
tycrek

26

Có một vài lỗi trong cả hai triển khai _utf8_decode. c1c2được gán dưới dạng các biến toàn cục do sử dụng varcâu lệnh bị hỏng và hoàn toàn c3không được khởi tạo hoặc khai báo.

Nó hoạt động, nhưng các biến này sẽ ghi đè lên bất kỳ biến nào có cùng tên bên ngoài hàm này.

Đây là một phiên bản sẽ không làm điều này:

// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
    var string = "";
    var i = 0;
    var c = 0, c1 = 0, c2 = 0;

    while ( i < utftext.length ) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if((c > 191) && (c < 224)) {
            c1 = utftext.charCodeAt(i+1);
            string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
            i += 2;
        }
        else {
            c1 = utftext.charCodeAt(i+1);
            c2 = utftext.charCodeAt(i+2);
            string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
            i += 3;
        }

    }
    return string;
}

9
@Daan Tôi không có đủ đại diện để chỉnh sửa câu trả lời khi tôi viết câu trả lời này ... vào năm 2011
cướp

2
IE7? Tôi đoán chúng ta nên ngừng lãng phí thời gian để viết mã cho điều đó, mọi người sẽ không ngừng sử dụng công nghệ cũ này trừ khi chúng tôi buộc các nhà phát triển buộc họ phải làm vậy!
Rami Dabain

@RonanDejhero nó không hoạt động trong IE7? Tôi không nhớ nếu tôi đã thử nghiệm trong trình duyệt cụ thể đó.
cướp

1
Điều tôi muốn nói là nếu nó không hoạt động trong IE7, thì không ai nên quan tâm!. tôi đã không kiểm tra và sẽ không kiểm tra nó :)
Rami Dabain

16

Tôi đã trả lời câu hỏi của Sunny, nhưng tôi muốn đóng góp lại một vài thay đổi tôi đã thực hiện cho dự án của riêng mình trong trường hợp bất kỳ ai cũng thấy nó hữu ích. Về cơ bản, tôi vừa mới dọn sạch mã gốc một chút để JSLint không phàn nàn nhiều và tôi đã thực hiện các phương thức được đánh dấu là riêng tư trong các nhận xét thực sự riêng tư. Tôi cũng đã thêm hai phương thức tôi cần trong dự án của riêng tôi, đó là decodeToHexencodeFromHex.

Mật mã:

var Base64 = (function() {
    "use strict";

    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    var _utf8_encode = function (string) {

        var utftext = "", c, n;

        string = string.replace(/\r\n/g,"\n");

        for (n = 0; n < string.length; n++) {

            c = string.charCodeAt(n);

            if (c < 128) {

                utftext += String.fromCharCode(c);

            } else if((c > 127) && (c < 2048)) {

                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);

            } else {

                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);

            }

        }

        return utftext;
    };

    var _utf8_decode = function (utftext) {
        var string = "", i = 0, c = 0, c1 = 0, c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {

                string += String.fromCharCode(c);
                i++;

            } else if((c > 191) && (c < 224)) {

                c1 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
                i += 2;

            } else {

                c1 = utftext.charCodeAt(i+1);
                c2 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
                i += 3;

            }

        }

        return string;
    };

    var _hexEncode = function(input) {
        var output = '', i;

        for(i = 0; i < input.length; i++) {
            output += input.charCodeAt(i).toString(16);
        }

        return output;
    };

    var _hexDecode = function(input) {
        var output = '', i;

        if(input.length % 2 > 0) {
            input = '0' + input;
        }

        for(i = 0; i < input.length; i = i + 2) {
            output += String.fromCharCode(parseInt(input.charAt(i) + input.charAt(i + 1), 16));
        }

        return output;
    };

    var encode = function (input) {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

        input = _utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output += _keyStr.charAt(enc1);
            output += _keyStr.charAt(enc2);
            output += _keyStr.charAt(enc3);
            output += _keyStr.charAt(enc4);

        }

        return output;
    };

    var decode = function (input) {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = _keyStr.indexOf(input.charAt(i++));
            enc2 = _keyStr.indexOf(input.charAt(i++));
            enc3 = _keyStr.indexOf(input.charAt(i++));
            enc4 = _keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output += String.fromCharCode(chr1);

            if (enc3 !== 64) {
                output += String.fromCharCode(chr2);
            }
            if (enc4 !== 64) {
                output += String.fromCharCode(chr3);
            }

        }

        return _utf8_decode(output);
    };

    var decodeToHex = function(input) {
        return _hexEncode(decode(input));
    };

    var encodeFromHex = function(input) {
        return encode(_hexDecode(input));
    };

    return {
        'encode': encode,
        'decode': decode,
        'decodeToHex': decodeToHex,
        'encodeFromHex': encodeFromHex
    };
}());

Ban đầu tôi nghĩ rằng việc bạn không kiểm soát kết nối đầu ra thành các câu lệnh riêng biệt sẽ tối ưu hơn, nhưng sau khi tôi nghĩ về nó trong một giây, điều này sẽ không hiệu quả hơn vì các chuỗi Javascript là bất biến và nó sẽ gây ra 4 bản sao của các đốm dữ liệu khổng lồ khi làm việc với các tệp dữ liệu nhị phân lớn. Đặt cược an toàn hơn để ghép 4 ký tự lại với nhau trước và sau đó xây dựng một chuỗi mới. Tôi ước tôi biết chắc chắn về một phương pháp xây dựng chuỗi tốt hơn mà chắc chắn sẽ hiệu quả trên tất cả các nền tảng. (thậm chí IE6)
Marius

Tôi đã không xem xét hiệu suất trong việc dọn sạch mã được đăng ban đầu. Tôi chỉ làm cho nó dễ đọc hơn và làm cho các phương thức được đánh dấu là riêng tư trong các nhận xét trong bản gốc thực sự là riêng tư bằng cách sử dụng mẫu mô-đun tiết lộ. Tôi chắc chắn rằng nó cũng có thể được tối ưu hóa liên quan đến hiệu suất. Không hoàn toàn chắc chắn khi bộ sưu tập rác sẽ hoạt động ở đây và việc băm các tệp lớn thông qua Javascript không phổ biến lắm (hoặc thực sự có thể không phải là giải pháp tối ưu trong mọi trường hợp).
Joe Dyndale

Thật buồn cười khi mã này sắp xếp cuộc sống ở đây. Đã có 3 phiên bản khác nhau của nó trên trang này.
gregn3

15

Để các trình duyệt mới hơn mã hóa Uint8Array thành chuỗi và giải mã chuỗi thành Uint8Array.

const base64 = {
    decode: s => Uint8Array.from(atob(s), c => c.charCodeAt(0)),
    encode: b => btoa(String.fromCharCode(...new Uint8Array(b)))
};

Đối với Node.js, bạn có thể sử dụng cách sau để mã hóa chuỗi, Bộ đệm hoặc Uint8Array thành chuỗi và giải mã từ chuỗi, Bộ đệm hoặc Uint8Array sang Bộ đệm.

const base64 = {
    decode: s => Buffer.from(s, 'base64'),
    encode: b => Buffer.from(b).toString('base64')
};

13

Để làm cho URL Chuỗi được mã hóa Base64 thân thiện, trong JavaScript, bạn có thể làm một cái gì đó như thế này:

// if this is your Base64 encoded string
var str = 'VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA=='; 

// make URL friendly:
str = str.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');

// reverse to original encoding
str = (str + '===').slice(0, str.length + (str.length % 4));
str = str.replace(/-/g, '+').replace(/_/g, '/');

Xem thêm Fiddle này: http://jsfiddle.net/magikMaker/7bjaT/


9
Tôi sẽ khiêm tốn đề nghị rằng việc sử dụng encodeURIComponentcũng có thể dẫn đến một kết quả vượt trội với ít chi tiêu cho nỗ lực từ phía nhà phát triển.
Pablo Fernandez

11
encodeURIComponent sẽ thay đổi độ dài của chuỗi được mã hóa base64 và thay thế '-' và '_' bằng '+' và '/' là cách thực hành chuẩn khi sử dụng base64 trong URL (ví dụ: docs.python.org/l Library / base64.html # base64 .urlsafe_b64encode ). Không cần phải khó chịu.
natevw


12

Tôi đã viết lại bằng tay, các phương pháp mã hóa và giải mã này ngoại trừ phương pháp thập lục phân thành định dạng mô đun để tương thích đa nền tảng / trình duyệt và cả với phạm vi riêng tư thực sự, và sử dụng btoaatobnếu chúng tồn tại do tốc độ thay vì sử dụng mã hóa riêng của nó:

https://gist.github.com/Nijikokun/5192472

Sử dụng:

base64.encode(/* String */);
base64.decode(/* String */);

utf8.encode(/* String */);
utf8.decode(/* String */);

12

Câu hỏi này và đó là câu trả lời chỉ cho tôi đi đúng hướng.
Đặc biệt với unicode atob và btoa không thể được sử dụng "vanilla" và ngày nay MỌI THỨ là unicode ..

Trực tiếp từ Mozilla, hai chức năng hay cho mục đích này (được thử nghiệm với các thẻ unicode và html bên trong)

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
b64EncodeUnicode('\n'); // "Cg=="



function b64DecodeUnicode(str) {
    return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
b64DecodeUnicode('Cg=='); // "\n"

Các hàm này sẽ thực hiện nhanh như chớp so với giải mã Base64 thô bằng cách sử dụng chức năng javascript tùy chỉnh vì btoa và atob được thực thi bên ngoài trình thông dịch.

Nếu bạn có thể bỏ qua IE cũ và điện thoại di động cũ (như iphone 3?) Thì đây là một giải pháp tốt.


10

nếu bạn cần mã hóa đối tượng hình ảnh HTML, bạn có thể viết hàm đơn giản như:

function getBase64Image(img) {  
  var canvas = document.createElement("canvas");  
  canvas.width = img.width;  
  canvas.height = img.height;  
  var ctx = canvas.getContext("2d");  
  ctx.drawImage(img, 0, 0);  
  var dataURL = canvas.toDataURL("image/png");  
  // escape data:image prefix
  return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");  
  // or just return dataURL
  // return dataURL
}  

Để có được base64 hình ảnh theo id:

function getBase64ImageById(id){  
  return getBase64Image(document.getElementById(id));  
} 

thêm ở đây


Đúng, và var img = hình ảnh mới (); img.src = "../images/myPic.png";
pdschuller

7

Đóng góp với một polyfill rút gọn cho window.atob+ window.btoamà tôi hiện đang sử dụng.

(function(){function t(t){this.message=t}var e="undefined"!=typeof exports?exports:this,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=Error(),t.prototype.name="InvalidCharacterError",e.btoa||(e.btoa=function(e){for(var o,n,a=0,i=r,c="";e.charAt(0|a)||(i="=",a%1);c+=i.charAt(63&o>>8-8*(a%1))){if(n=e.charCodeAt(a+=.75),n>255)throw new t("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");o=o<<8|n}return c}),e.atob||(e.atob=function(e){if(e=e.replace(/=+$/,""),1==e.length%4)throw new t("'atob' failed: The string to be decoded is not correctly encoded.");for(var o,n,a=0,i=0,c="";n=e.charAt(i++);~n&&(o=a%4?64*o+n:n,a++%4)?c+=String.fromCharCode(255&o>>(6&-2*a)):0)n=r.indexOf(n);return c})})();

6

Tôi muốn sử dụng các phương thức mã hóa / giải mã bas64 từ CryptoJS , thư viện phổ biến nhất cho các thuật toán mã hóa tiêu chuẩn và an toàn được triển khai trong JavaScript bằng cách sử dụng các mẫu và thực tiễn tốt nhất.


6

Đây là phiên bản AngularJS Factory của @ user850789:

'use strict';

var ProjectNameBase64Factory = angular.module('project_name.factories.base64', []);

ProjectNameBase64Factory.factory('Base64', function () {
    var Base64 = {
        // private property
        _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

        // public method for encoding
        encode: function (input) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;

            input = Base64._utf8_encode(input);

            while (i < input.length) {

                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);

                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;

                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }

                output = output +
                         Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
                         Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);

            }

            return output;
        },

        // public method for decoding
        decode: function (input) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;

            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

            while (i < input.length) {

                enc1 = Base64._keyStr.indexOf(input.charAt(i++));
                enc2 = Base64._keyStr.indexOf(input.charAt(i++));
                enc3 = Base64._keyStr.indexOf(input.charAt(i++));
                enc4 = Base64._keyStr.indexOf(input.charAt(i++));

                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;

                output = output + String.fromCharCode(chr1);

                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }

            }

            output = Base64._utf8_decode(output);

            return output;

        },

        // private method for UTF-8 encoding
        _utf8_encode: function (string) {
            string = string.replace(/\r\n/g, "\n");
            var utftext = "";

            for (var n = 0; n < string.length; n++) {

                var c = string.charCodeAt(n);

                if (c < 128) {
                    utftext += String.fromCharCode(c);
                }
                else if ((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }

            }

            return utftext;
        },

        // private method for UTF-8 decoding
        _utf8_decode: function (utftext) {
            var string = "";
            var i = 0;
            var c = 0, c2 = 0, c3 = 0;

            while (i < utftext.length) {

                c = utftext.charCodeAt(i);

                if (c < 128) {
                    string += String.fromCharCode(c);
                    i++;
                }
                else if ((c > 191) && (c < 224)) {
                    c2 = utftext.charCodeAt(i + 1);
                    string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                    i += 2;
                }
                else {
                    c2 = utftext.charCodeAt(i + 1);
                    c3 = utftext.charCodeAt(i + 2);
                    string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                    i += 3;
                }

            }
            return string;
        }
    };
    return Base64;
});

6

Tôi cần mã hóa chuỗi UTF-8 làm base64 cho một dự án của tôi. Hầu hết các câu trả lời ở đây dường như không xử lý đúng các cặp thay thế UTF-16 khi chuyển đổi sang UTF-8, vì vậy, để hoàn thành, tôi sẽ đăng giải pháp của mình:

function strToUTF8Base64(str) {

    function decodeSurrogatePair(hi, lo) {
        var resultChar = 0x010000;
        resultChar += lo - 0xDC00;
        resultChar += (hi - 0xD800) << 10;
        return resultChar;
    }

    var bytes = [0, 0, 0];
    var byteIndex = 0;
    var result = [];

    function output(s) {
        result.push(s);
    }

    function emitBase64() {

        var digits =
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
                'abcdefghijklmnopqrstuvwxyz' +
                '0123456789+/';

        function toDigit(value) {
            return digits[value];
        }

        // --Byte 0--    --Byte 1--    --Byte 2--
        // 1111  1122    2222  3333    3344  4444

        var d1 = toDigit(bytes[0] >> 2);
        var d2 = toDigit(
            ((bytes[0] & 0x03) << 4) |
            (bytes[1] >> 4));
        var d3 = toDigit(
            ((bytes[1] & 0x0F) << 2) |
            (bytes[2] >> 6));
        var d4 = toDigit(
            bytes[2] & 0x3F);

        if (byteIndex === 1) {
            output(d1 + d2 + '==');
        }
        else if (byteIndex === 2) {
            output(d1 + d2 + d3 + '=');
        }
        else {
            output(d1 + d2 + d3 + d4);
        }
    }

    function emit(chr) {
        bytes[byteIndex++] = chr;
        if (byteIndex == 3) {
            emitBase64();
            bytes[0] = 0;
            bytes[1] = 0;
            bytes[2] = 0;
            byteIndex = 0;
        }
    }

    function emitLast() {
        if (byteIndex > 0) {
            emitBase64();
        }
    }

    // Converts the string to UTF8:

    var i, chr;
    var hi, lo;
    for (i = 0; i < str.length; i++) {
        chr = str.charCodeAt(i);

        // Test and decode surrogate pairs in the string
        if (chr >= 0xD800 && chr <= 0xDBFF) {
            hi = chr;
            lo = str.charCodeAt(i + 1);
            if (lo >= 0xDC00 && lo <= 0xDFFF) {
                chr = decodeSurrogatePair(hi, lo);
                i++;
            }
        }

        // Encode the character as UTF-8.
        if (chr < 0x80) {
            emit(chr);
        }
        else if (chr < 0x0800) {
            emit((chr >> 6) | 0xC0);
            emit(((chr >> 0) & 0x3F) | 0x80);
        }
        else if (chr < 0x10000) {
            emit((chr >> 12) | 0xE0);
            emit(((chr >>  6) & 0x3F) | 0x80);
            emit(((chr >>  0) & 0x3F) | 0x80);
        }
        else if (chr < 0x110000) {
            emit((chr >> 18) | 0xF0);
            emit(((chr >> 12) & 0x3F) | 0x80);
            emit(((chr >>  6) & 0x3F) | 0x80);
            emit(((chr >>  0) & 0x3F) | 0x80);
        }
    }

    emitLast();

    return result.join('');
}

Lưu ý rằng mã không được kiểm tra kỹ lưỡng. Tôi đã thử nghiệm một số đầu vào, bao gồm những thứ như strToUTF8Base64('衠衢蠩蠨')và so sánh với đầu ra của một công cụ mã hóa trực tuyến ( https://www.base64encode.org/ ).


5

Đối với dự án của tôi, tôi vẫn cần hỗ trợ IE7 và làm việc với đầu vào lớn để mã hóa.

Dựa trên mã được đề xuất bởi Joe Dyndale và như được đề xuất trong nhận xét của Marius, có thể cải thiện hiệu suất với IE7 bằng cách xây dựng kết quả bằng một mảng thay vì một chuỗi.

Dưới đây là ví dụ cho mã hóa:

var encode = function (input) {
    var output = [], chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

    input = _utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output.push(_keyStr.charAt(enc1));
        output.push(_keyStr.charAt(enc2));
        output.push(_keyStr.charAt(enc3));
        output.push(_keyStr.charAt(enc4));

    }

    return output.join("");
};

5

Mặc dù công việc nhiều hơn một chút, nếu bạn muốn một giải pháp gốc hiệu suất cao, có một số hàm HTML5 bạn có thể sử dụng.

Nếu bạn có thể lấy dữ liệu của mình vào một Blob, thì bạn có thể sử dụng hàm FileReader.readAsDataURL () để lấy data://URL và cắt phần trước của dữ liệu để lấy dữ liệu cơ sở64.

Tuy nhiên, bạn có thể phải xử lý thêm để mã hóa dữ liệu, vì tôi không chắc liệu các +ký tự có được thoát hay không cho data://URL, nhưng điều này sẽ khá tầm thường.


5

Chà, nếu bạn đang sử dụng võ đường, nó cho chúng ta cách trực tiếp để mã hóa hoặc giải mã thành base64.

Thử cái này:-

Để mã hóa một mảng byte bằng cách sử dụng dojox.encoding.base64:

var str = dojox.encoding.base64.encode(myByteArray);

Để giải mã một chuỗi được mã hóa base64:

var bytes = dojox.encoding.base64.decode(str);

3

Bạn có thể sử dụng window.btoawindow.atob...

const encoded = window.btoa('Alireza Dezfoolian'); // encode a string
const decoded = window.atob(encoded); // decode the string

Có lẽ sử dụng cách MDN có thể thực hiện công việc của bạn tốt nhất ... Cũng chấp nhận unicode ... bằng hai hàm đơn giản sau:

// ucs-2 string to base64 encoded ascii
function utoa(str) {
    return window.btoa(unescape(encodeURIComponent(str)));
}
// base64 encoded ascii to ucs-2 string
function atou(str) {
    return decodeURIComponent(escape(window.atob(str)));
}
// Usage:
utoa('✓ à la mode'); // 4pyTIMOgIGxhIG1vZGU=
atou('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"

utoa('I \u2661 Unicode!'); // SSDimaEgVW5pY29kZSE=
atou('SSDimaEgVW5pY29kZSE='); // "I ♡ Unicode!"

3

Đây là một DEMO WEBCAM của atob()btoa()JS xây dựng trong các chức năng:

<!DOCTYPE html>
<html>
  <head>
    <style>
      textarea{
        width:30%;
        height:100px;
      }
    </style>
    <script>
      // encode string to base64
      function encode()
      {
        var txt = document.getElementById("txt1").value;
        var result = btoa(txt);
        document.getElementById("txt2").value = result;
      }
      // decode base64 back to original string
      function decode()
      {
        var txt = document.getElementById("txt3").value;
        var result = atob(txt);
        document.getElementById("txt4").value = result;
      }
    </script>
  </head>
  <body>
    <div>
      <textarea id="txt1">Some text to decode
      </textarea>
    </div>
    <div>
      <input type="button" id="btnencode" value="Encode" onClick="encode()"/>
    </div>
    <div>
      <textarea id="txt2">
      </textarea>
    </div>
    <br/>
    <div>
      <textarea id="txt3">U29tZSB0ZXh0IHRvIGRlY29kZQ==
      </textarea>
    </div>
    <div>
      <input type="button" id="btndecode" value="Decode" onClick="decode()"/>
    </div>
    <div>
      <textarea id="txt4">
      </textarea>
    </div>
  </body>
</html>

2

Sử dụng thư viện js-base64 như

btoa () không hoạt động với biểu tượng cảm xúc

var str = "I was funny 😂";
console.log("Original string:", str);

var encodedStr = Base64.encode(str)
console.log("Encoded string:", encodedStr);

var decodedStr = Base64.decode(encodedStr)
console.log("Decoded string:", decodedStr);
<script src="https://cdn.jsdelivr.net/npm/js-base64@2.5.2/base64.min.js"></script>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.