js java base64_JS实现base64编码与解码

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同(本类库里面用的是`+`,`/`这两个字符)。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据。

Base64其实是一种简单的置换加密方式,但是BASE64的用处往往并不是为了防止信息泄露,而且为了方便传输,进过BASE64编码后的信息会比原始信息长,大概是4/3倍。

var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

var 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, -1, -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);

/**

* base64编码

* @param {Object} str

*/

function base64encode(str){

var out, i, len;

var c1, c2, c3;

len = str.length;

i = 0;

out = "";

while (i 

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

if (i == len) {

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

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

out += "==";

break;

}

c2 = str.charCodeAt(i++);

if (i == len) {

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

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

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

out += "=";

break;

}

c3 = str.charCodeAt(i++);

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

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

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

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

}

return out;

}

/**

* base64解码

* @param {Object} str

*/

function base64decode(str){

var c1, c2, c3, c4;

var i, len, out;

len = str.length;

i = 0;

out = "";

while (i 

/* c1 */

do {

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

}

while (i 

if (c1 == -1)

break;

/* c2 */

do {

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

}

while (i 

if (c2 == -1)

break;

out += String.fromCharCode((c1 <> 4));

/* c3 */

do {

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

if (c3 == 61)

return out;

c3 = base64DecodeChars[c3];

}

while (i 

if (c3 == -1)

break;

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

/* c4 */

do {

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

if (c4 == 61)

return out;

c4 = base64DecodeChars[c4];

}

while (i 

if (c4 == -1)

break;

out += String.fromCharCode(((c3 & 0x03) <

}

return out;

}

/**

* utf16转utf8

* @param {Object} str

*/

function utf16to8(str){

var out, i, len, c;

out = "";

len = str.length;

for (i = 0; i 

c = str.charCodeAt(i);

if ((c >= 0x0001) && (c <= 0x007F)) {

out += str.charAt(i);

}

else

if (c > 0x07FF) {

out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));

out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));

out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));

}

else {

out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));

out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));

}

}

return out;

}

/**

* utf8转utf16

* @param {Object} str

*/

function utf8to16(str){

var out, i, len, c;

var char2, char3;

out = "";

len = str.length;

i = 0;

while (i 

c = str.charCodeAt(i++);

switch (c >> 4) {

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

// 0xxxxxxx

out += str.charAt(i - 1);

break;

case 12:

case 13:

// 110x xxxx 10xx xxxx

char2 = str.charCodeAt(i++);

out += String.fromCharCode(((c & 0x1F) <

break;

case 14:

// 1110 xxxx10xx xxxx10xx xxxx

char2 = str.charCodeAt(i++);

char3 = str.charCodeAt(i++);

out += String.fromCharCode(((c & 0x0F) <

break;

}

}

return out;

}

//demo

//function doit(){

//    var f = document.f;

//    f.output.value = base64encode(utf16to8(f.source.value));

//    f.decode.value = utf8to16(base64decode(f.output.value));

//}

aa25c4a4e505984995f48b5e00409f21.png

推荐您阅读更多有关于“ jsxmlBase64传输 ”的文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值