• base64编码是啥?



    yma16-logo

    前言

    大家好,我是yma16,本文分享base64编码的基础知识
    base64刚发展历史
    Base64是一种基于64个字符的编码算法,可以将二进制数据转换成ASCII码表示的文本格式,常用于电子邮件、HTTP等网络协议中的数据传输。Base64的发展历史如下:

    1. 最早的Base64是由MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)团队在RFC2045中定义的。该规范于1996年发布,主要是为了解决邮件传输中的数据类型和编码问题。

    2. Base64由于其简单、有效的编码方式,逐渐被广泛应用于互联网领域,比如在HTTP协议中用于将用户名和密码等敏感信息以Base64编码的形式发送给Web服务器。同时,Base64也被用来加密存储在数据库中的敏感信息,比如密码和信用卡号等。

    3. 随着互联网技术的发展,越来越多的编码算法被开发出来,比如Base32、Base58等。这些新的编码算法在某些场景下比Base64更为适用,但是Base64仍然是最为普遍和常用的编码算法之一。

    总之,Base64的发展历史可以追溯到1996年,至今已经成为互联网领域中使用最广泛的编码算法之一。

    base64

    防止不可见的控制字符(0~31以及127),比如回车,换行等在编码是发生错误,产生了base编码
    用64个可打印字符来表示二进制数据
    为什么是64
    3字节转化为4字节

    编码表

    范围:[A-Za-z0-9+/]+

    1. 将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
    2. 将上面的24个二进制位每6个一组,共分为4组。
    3. 在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
    4. 根据Base64编码对照表(见下图)获得对应的值。
    0 A  17 R   34 i   51 z
    
    1 B  18 S   35 j   52 0
    
    2 C  19 T   36 k   53 1
    
    3 D  20 U   37 l   54 2
    
    4 E  21 V   38 m   55 3
    
    5 F  22 W   39 n   56 4
    
    6 G  23 X   40 o   57 5
    
    7 H  24 Y   41 p   58 6
    
    8 I  25 Z   42 q   59 7
    
    9 J  26 a   43 r   60 8
    
    10 K  27 b   44 s   61 9
    
    11 L  28 c   45 t   62 +
    
    12 M  29 d   46 u   63 /
    
    13 N  30 e   47 v
    
    14 O  31 f   48 w   
    
    15 P  32 g   49 x
    
    16 Q  33 h   50 y
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    举例

    文本Man
    ascii7797110
    二进制位01001101011000101101110
    划分为4字节010011010110000101101110

    3个字节24位,划分为4个字节,32位,不够8位向前补0,6bit补为8bit

    补000010011000101100000010100101110
    索引1922546
    base64TWFU

    = 的出现

    如果不够三字节,用0填到三字节,同时补充了多少个字节的0,末尾就添加就几个=

    js实现base64(参考)

    js-base的github:
    https://github.com/mathiasbynens/base64

    //加密、解密算法封装:
    function Base64() {
    	// private property
    	let _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    	// public method for encoding
    	this.encode = function(input) {
    		var output = "";
    		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    		var i = 0;
    		input = _checkChar(input)
    		input = _utf8_encode(input);
    		// console.log(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 +
    				_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
    				_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
    		};
    		output = output.replace('+','%2B');// 这个后台识别不了+,所以替换了一下,这个也可以不用替换,视实际情况定
    		return output;
    	};
     
    	// public method for decoding
    	this.decode = function(input) {
    		var output = "";
    		var chr1, chr2, chr3;
    		var enc1, enc2, enc3, enc4;
    		var i = 0;
    		if (typeof(input) == String) {
    			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    		}else{
    			return input
    		}
    		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 = output + String.fromCharCode(chr1);
    			if (enc3 != 64) {
    				output = output + String.fromCharCode(chr2);
    			}
    			if (enc4 != 64) {
    				output = output + String.fromCharCode(chr3);
    			}
    		}
    		output = _utf8_decode(output);
    		output = _returnJson(output);
    		return output;
    	}
     
    	// private method for UTF-8 encoding
    	let _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);
    			}
     
    		}
    		// console.log(utftext);
    		return utftext;
    	}
     
    	// private method for UTF-8 decoding
    	let _utf8_decode = function(utftext) {
    		var string = "";
    		var i = 0;
    		var c1, c2, c3;
    		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;
    	}
    	let _checkChar = function(textJson) {
    		var pattern = new RegExp("[\u4E00-\u9FA5]+");
    		for (let item in textJson) {
    			if (pattern.test(textJson[item])) {
    				textJson[item] = encodeURIComponent(textJson[item]);
    			}
    		}
    		return JSON.stringify(textJson);
    	}
    	let _returnJson = function(textString) {
    		let res = JSON.parse(textString);
    		for (let item in res) {
    			res[item] = decodeURIComponent(res[item]);
    		}
    		return res;
    	}
    }
    
    • 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
    • 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
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128

    结束

    本文分享到这结束,如有错误或者不足之处欢迎指出,感谢大家的阅读!

    在这里插入图片描述

  • 相关阅读:
    Linux命令之getfacl和setfacl命令
    如果可以,带项目真的别只靠经验了
    @Scope与@RefreshScope注解
    无线通信网络
    【mitmproxy 用法】
    【CAN总线】从数字设计的角度分析CAN协议1—CAN概述
    Minio设置文件永久访问和下载
    Python使用traceback.print_exc()输出异常信息
    递归思想
    Linux友好度太低?试试Clion远程开发|ssh连接远程主机
  • 原文地址:https://blog.csdn.net/qq_38870145/article/details/127764477