我正在使用文件api在js中压缩文件的项目。我使用Huffmann Coding在javascript中压缩文件。现在我得到了包含编码位的字符串。可以帮我转换成实际位以便文件大小必须减少。
我的Js:
<script type="text/javascript">
function loadFile(o) {
var fr = new FileReader();
fr.onload = function(e) {
showDataFile(e, o);
};
fr.readAsText(o.files[0]);
}
function showDataFile(e, o) {
document.getElementById("data").innerHTML = e.target.result;
var freqs = {};
freqs = frequency(e.target.result);
var tup = [];
tup = sortfreq(frequency(e.target.result));
//console.log(tup);
tree = buildTree(tup);
assignCode(tree, pat);
encoded = encode(e.target.result);
document.getElementById("data1").innerHTML = encoded;
/* alert(encoded); */
}
function frequency(str) {
var freqs = {};
for (var i in str) {
if (freqs[str[i]] == undefined) {
freqs[str[i]] = 1;
} else {
freqs[str[i]] = freqs[str[i]] + 1;
}
}
return freqs;
}
function sortfreq(freqs) {
var tuples = [];
for (var
let in freqs) {
tuples.push([freqs[let],
let
]);
}
return tuples.sort();
}
function buildTree(tuples) {
while (tuples.length > 1) {
leastTwo = [tuples[0][1], tuples[1][1]]
//console.log(leastTwo);
theRest = tuples.slice(2, tuples.length);
//console.log(theRest);
combFreq = tuples[0][0] + tuples[1][0];
//console.log(combFreq);
tuples = theRest;
end = [combFreq, leastTwo];
tuples.push(end);
//console.log(tuples);
tuples.sort();
//console.log(tuples);
}
return tuples[0][1];
}
code = {};
pat = '';
//assiging codes to each letter
function assignCode(node, pat) {
if (typeof(node) == typeof(""))
code[node] = pat;
else {
assignCode(node[0], pat + '0');
assignCode(node[1], pat + '1');
}
}
function encode(string) {
output = '';
for (s in string)
output += code[string[s]];
return output;
}
</script>
我的身体:
Select file to read </pre> input type="file" onchange="loadFile(this)"><br>
Before Encoding: <p id="data"></p>
After Encoding: <p id="data1"></p>
浏览器上的我的输出:
Before Encoding:
hiiiiiiiiiiiiihhhhiiiiiiiiiijjjjkk
After Encoding:
1001001001001001001001001001001001001001111100100100100100100100100100100101010101000000