Base64编码与URLEncode的简介

原文
一、关于Base64编码:
虽然常用却没注意过,一般Base64,包含英文字母AZ、az、数字0-9,这样62个字元,然后呢,这样还少2个字元才64个,这另外两个就是+、/两个符号,最后呢,编码完成依据状况会补上=,详细的说明可以参考wiki。
https://zh.wikipedia.org/wiki/Base64
之前使用的情境通常是在http的header中使用,比如oauth相关的应用,可是当打算于url中使用base64编码时,就可以发生问题了,因为编码中包含了"+“跟”/",于QueryString使用需在编码过,在Restful的api使用时,"/“更是会造成url路径错误。
针对这个问题,Base64有一个变种,通常会说是URL and Filename Safe Alphabet,符合RFC4648, Section 5.规范,这个规范将”+"、"/“至换成”-"、"_",并移除最后的"="

二、Nodejs的Base64 encode与decode
在Nodejs常这样用

var code = new Buffer("Base64是一種基於64個可列印字元來表示二進位資料的表示方法").toString('base64');
//code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
console.log("code:"+code);

var decode = new Buffer(code , 'base64').toString();
//decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
console.log("decode:"+decode);

如上面显示的结果,Buffer.toString(),指定base64时,会依据Base64的原始规范进行编码,所以会包含"+"、"/"、"="
那要怎么办?可以自己处理把"+“换成”-",把"/“换成”_",然后移除"="

//接续上一范例


//接續上一範例

//code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("code:"+code.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"));

另外也有套件可以安装,我是使用base64url
npm网址
https://www.npmjs.com/package/base64url

三、解码怎么办?
关于解码的部份,不管是基本款还是RFC4648, Section 5的版本,Nodejs的Buffer都可解码,完整的范例如下:

const base64url = require('base64url');

var code = new Buffer("Base64是一種基於64個可列印字元來表示二進位資料的表示方法").toString('base64');

//code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
console.log("code:"+code);

//code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("code:"+code.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"));

var decode = new Buffer(code , 'base64').toString();
//decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
console.log("decode:"+decode);

//使用base64url轉換為url safe的Base64編碼
var safeUrl = base64url.fromBase64(code);
//safeUrl:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("safeUrl:"+safeUrl);

//decode2:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
var decode2 = new Buffer(safeUrl , 'base64').toString();
console.log("decode2:"+decode2);

/**
output:
code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
safeUrl:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
decode2:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
 */
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值