crypto-js
https://github.com/brix/crypto-js
base64-js
https://github.com/beatgammit/base64-js
前端utf-8字串通訊時常會需要轉編譯處理,可避免其中的特殊字元或符號,而utf-8字串要轉Base64時通常需要呼叫window.btoa,也不能使用任意字元,得要先行處理例如呼叫encodeURIComponent,而若需要於後端Node.js進行這些工作,這邊推薦可使用CryptoJS來處理utf-8字串正轉反轉成Base64。
而由Base64字串轉至Binary(uint8 array)時可減少傳輸量,也可減少儲存所需體積,但這需要專門處理。過去我自己是常使用base64-js套件處理,後來研究CryptoJS也能替換base64-js。後面程式碼為使用CryptoJS封裝後的轉換函式,給有興趣的朋友自行測試與運用。
以下為單html檔測試範例︰
載入後畫面為︰
#Javascript, crypto-js, base64-js, utf-8, string, base64, binary, uint8, array
https://github.com/brix/crypto-js
base64-js
https://github.com/beatgammit/base64-js
前端utf-8字串通訊時常會需要轉編譯處理,可避免其中的特殊字元或符號,而utf-8字串要轉Base64時通常需要呼叫window.btoa,也不能使用任意字元,得要先行處理例如呼叫encodeURIComponent,而若需要於後端Node.js進行這些工作,這邊推薦可使用CryptoJS來處理utf-8字串正轉反轉成Base64。
而由Base64字串轉至Binary(uint8 array)時可減少傳輸量,也可減少儲存所需體積,但這需要專門處理。過去我自己是常使用base64-js套件處理,後來研究CryptoJS也能替換base64-js。後面程式碼為使用CryptoJS封裝後的轉換函式,給有興趣的朋友自行測試與運用。
以下為單html檔測試範例︰
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>crypto.js & base64.js Convert Demo</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!--使用crypto-js-->
<!--https://github.com/brix/crypto-js-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<!--使用base64-js-->
<!--https://github.com/beatgammit/base64-js-->
<script src="https://cdn.jsdelivr.net/npm/base64-js@1.3.0/base64js.min.js"></script>
</head>
<body>
<div id="app"></div>
<script>
function str2b64(str) {
//utf-8任意字串轉base64字串
let b64 = window.btoa(unescape(encodeURIComponent(str)))
return b64
}
function cp_str2b64(str) {
//utf-8任意字串轉base64字串
let words = CryptoJS.enc.Utf8.parse(str);
let b64 = CryptoJS.enc.Base64.stringify(words);
return b64
}
function b642str(b64) {
//base64字串轉回utf-8任意字串
let str = decodeURIComponent(escape(window.atob(b64)))
return str
}
function cp_b642str(b64) {
//base64字串轉回utf-8任意字串
let wa = CryptoJS.enc.Base64.parse(b64);
let str = wa.toString(CryptoJS.enc.Utf8);
return str
}
function b64tobin(b64) {
//base64字串轉binary(u8array)
let bin = base64js.toByteArray(b64)
return bin
}
function cp_b64tobin(b64) {
//base64字串轉binary(u8array)
let wa = CryptoJS.enc.Base64.parse(b64)
let words = wa.words;
let sigBytes = wa.sigBytes;
let bin = new Uint8Array(sigBytes);
for (var i = 0; i < sigBytes; i++) {
let byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
bin[i] = byte;
}
return bin
}
function bintob64(bin) {
//binary(u8array)轉回base64字串
return base64js.fromByteArray(bin)
}
function cp_bintob64(bin) {
//binary(u8array)轉回base64字串
let wa = CryptoJS.lib.WordArray.create(bin)
let b64 = wa.toString(CryptoJS.enc.Base64)
return b64
}
console.log = function (c, v) {
//覆蓋log, 使用jQuery輸出至網頁
$('#app').append('<div style="padding:3px;">' + 'log: ' + c + ', ' + v + '</div>')
}
let c = 'Hello 中文 はは'
//utf-8任意字串轉base64字串
let b64_1 = str2b64(c)
let b64_2 = cp_str2b64(c)
console.log('str2b64', b64_1)
console.log('cp_str2b64', b64_2)
//SGVsbG8gV29ybGQ=
//base64字串轉回utf-8任意字串
let c_1 = b642str(b64_1)
let c_2 = cp_b642str(b64_2)
console.log('b642str', c_1)
console.log('cp_b642str', c_2)
//Hello World
//base64字串轉binary(u8array)
let b_1 = b64tobin(b64_1)
let b_2 = cp_b64tobin(b64_2)
console.log('b64tobin', b_1)
console.log('cp_b64tobin', b_2)
//Uint8Array(11) [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
//binary(u8array)轉回base64字串
let bb64_1 = bintob64(b_1)
let bb64_2 = cp_bintob64(b_2)
console.log('bintob64', bb64_1)
console.log('cp_bintob64', bb64_2)
//SGVsbG8gV29ybGQ=
</script>
</body>
</html>
載入後畫面為︰
#Javascript, crypto-js, base64-js, utf-8, string, base64, binary, uint8, array

留言
張貼留言