编码
UTF8 ASCII UTF16 区别
base64
Base64编码是一种用于将二进制数据转换为可打印ASCII字符的编码方式。它的原理如下:
-
将原始数据划分为连续的字节序列。
-
将每个字节转换为8位二进制数。
-
将这些二进制数按照6位一组进行分组,不足6位的用0补齐。
-
将每个6位的二进制数转换为对应的十进制数。
-
根据Base64字符表,将十进制数转换为相应的可打印ASCII字符。
Base64字符表由64个字符组成,通常使用以下字符:A-Z、a-z、0-9以及字符"+"和"/"。这些字符可以通过索引值与相应的十进制数进行对应。
编码过程中,如果原始数据的长度不是3的倍数,会根据需要进行填充。填充通常使用字符"=",每个填充字符表示4位的零值。
解码时,按照相反的过程进行操作。将Base64编码后的字符串按照4个字符一组分组,并将每个字符转换回对应的十进制数。然后将这些十进制数转换为6位二进制数,并将这些二进制数连接起来。最后,将连接后的二进制数划分为8位一组,并将每个8位二进制数转换为对应的字节数据。
Base64编码主要应用于在文本协议中传输或存储二进制数据,例如在电子邮件中传输附件或在Web中传输图像数据。它可以将二进制数据转换为ASCII字符,使其在不支持二进制传输的环境中能够正常处理。
霍夫曼编码
霍夫曼编码是一种无损数据压缩算法,主要用于文件压缩。其原理如下:
- 统计每个字符出现的频率。
- 根据频率构建一棵霍夫曼树,频率越高的字符离根节点越近。
- 根据霍夫曼树为每个字符分配一个唯一的二进制编码,频率越高的字符编码越短。
示例
class HuffmanNode {
constructor (char, freq, left = null, right = null) {
this.char = char
this.freq = freq
this.left = left
this.right = right
}
}
function buildHuffmanTree (str) {
const freqMap = new Map()
for (const char of str) {
freqMap.set(char, (freqMap.get(char) || 0) + 1)
}
const nodes = Array.from(freqMap.entries()).map(([char, freq]) => new HuffmanNode(char, freq))
while (nodes.length > 1) {
nodes.sort((a, b) => a.freq - b.freq)
const left = nodes.shift()
const right = nodes.shift()
const newNode = new HuffmanNode(null, left.freq + right.freq, left, right)
nodes.push(newNode)
}
return nodes[0]
}
function buildHuffmanCodes (node, prefix = '', codes = {}) {
if (node.char !== null) {
codes[node.char] = prefix
} else {
buildHuffmanCodes(node.left, prefix + '0', codes)
buildHuffmanCodes(node.right, prefix + '1', codes)
}
return codes
}
const str = 'this is an example for huffman encoding'
const huffmanTree = buildHuffmanTree(str)
const huffmanCodes = buildHuffmanCodes(huffmanTree)
console.log(huffmanCodes)