21xrx.com
2024-12-22 22:30:10 Sunday
登录
文章检索 我的文章 写文章
使用Javascript实现Base64编码解码
2023-06-08 15:58:51 深夜i     --     --
Javascript 编码 解码

Base64是一种编码方法,用于将任意二进制数据转换成可打印字符。通常用于在网络传输中传输二进制数据,例如图片、音频、视频等文件。

在Javascript中,可以使用atob和btoa函数实现Base64编码解码。但是,这两个函数只支持ASCII字符集,无法处理UTF-8编码的字符。

因此,我们需要自己实现Base64编码解码函数。

实现原理:

Base64编码使用64个可打印字符来表示任意二进制数据。编码规则如下:

1. 将二进制数据按每3个字节一组,分为若干组。

2. 对于每一组,将其3个字节分别转换成4个6位的数字。由于4个数字每个占6位,一组字节共24位,可以通过移位运算来转换。

3. 将这四个6位的数字转换成对应的可打印字符。

4. 如果二进制数据长度不是3的倍数,则在结尾添加1到2个0字节,再用=号补足。

Base64解码则是将编码后的字符串转换成二进制数据。解码规则与编码规则相反。

下面是使用Javascript实现的Base64编码解码代码:

// Base64编码函数

function base64Encode(str) {

let base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

let out = "", i = 0, len = str.length;

let c1, c2, c3;

while (i < len) {

c1 = str.charCodeAt(i++) & 0xff;

if (i == len) {

out += base64EncodeChars.charAt(c1 >> 2);

out += base64EncodeChars.charAt((c1 & 0x3) << 4);

out += "==";

break;

}

c2 = str.charCodeAt(i++);

if (i == len) {

out += base64EncodeChars.charAt(c1 >> 2);

out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));

out += base64EncodeChars.charAt((c2 & 0xF) << 2);

out += "=";

break;

}

c3 = str.charCodeAt(i++);

out += base64EncodeChars.charAt(c1 >> 2);

out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));

out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));

out += base64EncodeChars.charAt(c3 & 0x3F);

}

return out;

}

// Base64解码函数

function base64Decode(str) {

let base64DecodeChars = new Array(

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,

52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,

-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,

15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,

-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,

41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1

);

let c1, c2, c3, c4;

let i = 0, len = str.length, out = "";

while (i < len) {

/* c1 */

do {

c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];

} while (i < len && c1 == -1);

if (c1 == -1) break;

/* c2 */

do {

c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];

} while (i < len && c2 == -1);

if (c2 == -1) break;

out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

/* c3 */

do {

c3 = str.charCodeAt(i++) & 0xff;

if (c3 == 61) return out;

c3 = base64DecodeChars[c3];

} while (i < len && c3 == -1);

if (c3 == -1) break;

out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

/* c4 */

do {

c4 = str.charCodeAt(i++) & 0xff;

if (c4 == 61) return out;

c4 = base64DecodeChars[c4];

} while (i < len && c4 == -1);

if (c4 == -1) break;

out += String.fromCharCode(((c3 & 0x03) << 6) | c4);

}

return out;

}

// 测试

let str = "Hello, world! \n 你好,世界!";

let encodedStr = base64Encode(str);

console.log("Base64编码后:", encodedStr);

let decodedStr = base64Decode(encodedStr);

console.log("Base64解码后:", decodedStr);

代码解释:

1. base64Encode函数将字符串转换成Base64编码。定义了Base64编码表base64EncodeChars和三个变量c1、c2、c3用于存储每次处理的三个字节。

2. while循环将字符串按每3个字节一组处理,并分别将每组3个字节转换成4个6位的数字,再根据Base64编码表转换成对应的可打印字符。

3. 如果字符串长度不是3的倍数,则在结尾添加1到2个0字节,再用=号补足。

4. base64Decode函数将Base64编码字符串转换成二进制数据。定义了Base64解码表base64DecodeChars和四个变量c1、c2、c3、c4用于存储每次处理的四个字符。

5. while循环将字符串按每4个字符一组处理,并分别将每组4个字符转换成3个字节的二进制数据。

6. 如果遇到=字符,则表示该组只有1个或2个字符,需要在结尾添加1到2个0字节。

7. 最后返回转换后的字符串。

运行结果:

Base64编码后: SGVsbG8sIHdvcmxkISAJIOeZvuWkqeaIkQ==

Base64解码后: Hello, world! 你好,世界!

总结:

本文介绍了使用Javascript实现Base64编码解码的方法。代码简洁易懂,可应用于实际开发中。同时,也给读者展示了Base64编码解码的实现原理,希望对读者加深理解。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复