JavaScript是一種非常常見且重要的編程語言。編碼和解碼是JavaScript中經常使用的技術。當然,我們也可以使用其他編程語言實現這些功能,但是在本文中,我們將把JavaScript作為中心,從不同的角度來講解編碼和解碼的技術。
一、Base64編碼和解碼
Base64編碼是一種將二進位數據轉換成ASCII字元串的編碼方式。在實際應用中,Base64編碼被廣泛使用,尤其是在傳輸二進位數據或在傳統的郵件系統中。
在JavaScript中可以使用原生方法btoa進行Base64編碼,使用atob進行Base64解碼。
let str = "Hello World!";
let encoded = btoa(str);
let decoded = atob(encoded);
上述例子中,將字元串”Hello World!”進行Base64編碼後,得到的結果為”SGVsbG8gV29ybGQh”,在進行Base64解碼後,結果會恢復成原來的字元串。
二、URL編碼和解碼
如果我們需要在URL中傳遞特殊字元或非ASCII字元的話,我們就需要對其進行URL編碼。在JavaScript中,可以使用原生方法encodeURIComponent進行URL編碼,使用decodeURIComponent進行URL解碼。
let str = "https://www.example.com?$param=value";
let encoded = encodeURIComponent(str);
let decoded = decodeURIComponent(encoded);
上述例子中,將字元串”https://www.example.com?$param=value”進行URL編碼後,得到的結果為”https%3A%2F%2Fwww.example.com%3F%24param%3Dvalue”。在進行URL解碼後,結果會恢復成原來的字元串。
三、Unicode編碼和解碼
Unicode是一種字符集,它包含了全世界範圍內所有需要的字元。在JavaScript中,我們可以使用字元編碼和解碼函數實現對Unicode編碼和解碼的操作。
Unicode編碼是將字元轉換成數字表示,而Unicode解碼則是將數字表示轉換成相應的字元。
let str = "我愛編程";
let encoded = "";
let decoded = "";
for (let i = 0; i < str.length; i++) {
encoded += "\\u" + str.charCodeAt(i).toString(16);
}
decoded = unescape(encoded.replace(/\\u/g, "%u"));
console.log(encoded);
console.log(decoded);
上述例子中,將字元串”我愛編程”進行Unicode編碼後,得到的結果為”\u6211\u7231\u7f16\u7a0b”,在進行Unicode解碼後,結果會恢復成原來的字元串。
四、JSON編碼和解碼
JSON是JavaScript Object Notation的縮寫,它是一種輕量級的數據交換格式。在JavaScript中,我們可以使用JSON.stringify將對象轉換成JSON字元串,使用JSON.parse將JSON字元串轉換成對象。
let data = {
name: "Tom",
age: 18,
address: {
city: "Beijing",
street: "123 Main St"
}
};
let encoded = JSON.stringify(data);
let decoded = JSON.parse(encoded);
上述例子中,將一個對象進行JSON編碼後,得到的結果為”{“name”:”Tom”,”age”:18,”address”:{“city”:”Beijing”,”street”:”123 Main St”}}”,在進行JSON解碼後,結果會恢復成原來的對象。
五、加密和解密
加密和解密是一種常見的編碼和解碼技術。在JavaScript中,我們可以使用原生方法crypto.subtle進行這些操作。
下面是一個使用AES-CBC加密和解密的例子:
async function encrypt(str, key) {
let encoder = new TextEncoder();
let data = encoder.encode(str);
let iv = crypto.getRandomValues(new Uint8Array(16));
let algorithm = {
name: "AES-CBC",
iv: iv
};
let cryptoKey = await crypto.subtle.importKey("raw", key, algorithm, false, ["encrypt"]);
let encrypted = await crypto.subtle.encrypt(algorithm, cryptoKey, data);
return iv.toString() + new Uint8Array(encrypted).toString();
}
async function decrypt(str, key) {
let iv = new Uint8Array(str.substr(0, 16));
let data = new Uint8Array(str.substr(16));
let algorithm = {
name: "AES-CBC",
iv: iv
};
let cryptoKey = await crypto.subtle.importKey("raw", key, algorithm, false, ["decrypt"]);
let decrypted = await crypto.subtle.decrypt(algorithm, cryptoKey, data);
let decoder = new TextDecoder();
return decoder.decode(decrypted);
}
let str = "Hello World!";
let key = crypto.getRandomValues(new Uint8Array(16));
encrypt(str, key).then((encrypted) => {
console.log(encrypted);
decrypt(encrypted, key).then((decrypted) => {
console.log(decrypted);
});
});
上述例子中,我們使用AES-CBC進行加密和解密,使用crypto.getRandomValues生成一個隨機秘鑰,將字元串”Hello World!”加密後,得到的結果為一個包含IV和密文的字元串,使用相同的秘鑰進行解密後,結果會恢復成原來的字元串。
六、總結
在JavaScript中,我們有很多種方法用於編碼和解碼。以上所提到的僅僅是其中的一部分。我們需要根據實際的需求來選擇合適的編碼和解碼技術,以實現我們所需要的功能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245931.html