Я пытаюсь преобразовать биты в base64.
Например:
0000000001 -> AE ==
Я хотел бы использовать 10 бит каждый раз.
Пока все работает нормально.
Мой план состоял в том, чтобы создать поле ввода, в котором вы можете ввести 10 бит или 2 * 10 бит или 3 * 10 бит и так далее ...
затем при отправке он должен разбить 10 бит таким образом, чтобы они были кодируемыми в base64, согласно следующей схеме:
https://manansingh.github.io/Cryptolab-Offline/c10-bits2base64.html
так: 0000000001 -> 000000 000100 -> AE ==
все это прекрасно работает, но теперь оно приходит:
при экспорте в загружаемый .bin-файл я использую элемент :
<a href="data:application/octet-stream;base64,AE==" download="test.bin"></a>
будет экспортирован, и после открытия файла в текстовом редакторе будет показано: NUL .
Опять же, это понятно, потому что это не ascii. Но при импорте этого точного файла обратно на мою HTML-страницу он показывает, что источник (в base64): AA ==
Так почему же AE == при экспорте изменений в AA ==
это, кстати, не всегда так: 1010101010 = qo ==
это не превращается в AA ==, но в: qg ==
это странное изменение происходит почти во всех случаях.
Вот мои исходные файлы, может быть, это поможет:
(index.html, base64.js, upload.js)
index.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<input type="text" id="10bits" name="10bits">
<button onclick="encode(document.getElementById('10bits').value);">submit</button>
<br/><br/>
<input type="file" id="fileinput" />
<script src="base64.js"></script>
<script src="upload.js"></script>
<script>
function encode(bin){
var a6bit = bitBase64(bin);
}
</script>
</body>
</html>
base64.js
function bitBase64(bin){
base64bits = [];
var base64 = "";
var binsize = bin.length/6;
for(i = 0; i < binsize; i++){
if(bin.substring(i*6,i*6+6).length == 6){
base64bits.push(parseInt(bin.substring(i*6,i*6+6), 2));
}else{
var endbyte = bin.substring(i*6,i*6+6);
var endbyteleft = 6 - endbyte.length;
for(e = 0; e < endbyteleft; e++){
endbyte += "0";
}
base64bits.push(parseInt(endbyte, 2));
}
//var hexa = parseInt(bitArray[i], 2).toString(16).toUpperCase();
}
var base64bitssize = base64bits.length;
for(i = 0; i < base64bitssize; i++){
base64 += base64encode(base64bits[i]);
}
if(base64.length % 4 == 0){
}else if(base64.length % 4 == 1){
base64 += "A==";
}else if(base64.length % 4 == 2){
base64 += "==";
}else if(base64.length % 4 == 3){
base64 += "=";
}
console.log(base64);
//var sampleBytes = base64ToArrayBuffer(base64);
var sampleBytes = base64;
saveByteArray([sampleBytes], 'test.bin');
}
function base64ToArrayBuffer(base64) {
var binaryString = window.atob(base64);
var binaryLen = binaryString.length;
var bytes = new Uint8Array(binaryLen);
for (var i = 0; i < binaryLen; i++) {
var ascii = binaryString.charCodeAt(i);
bytes[i] = ascii;
}
return bytes;
}
var saveByteArray = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, name) {
url = "data:application/octet-stream;base64," + data;
a.href = url;
a.download = name;
a.click();
window.URL.revokeObjectURL(url);
};
}());
function base64encode(bits){
switch(bits){
case 0:
return "A";
break;
case 1:
return "B";
break;
case 2:
return "C";
break;
case 3:
return "D";
break;
case 4:
return "E";
break;
case 5:
return "F";
break;
case 6:
return "G";
break;
case 7:
return "H";
break;
case 8:
return "I";
break;
case 9:
return "J";
break;
case 10:
return "K";
break;
case 11:
return "L";
break;
case 12:
return "M";
break;
case 13:
return "N";
break;
case 14:
return "O";
break;
case 15:
return "P";
break;
case 16:
return "Q";
break;
case 17:
return "R";
break;
case 18:
return "S";
break;
case 19:
return "T";
break;
case 20:
return "U";
break;
case 21:
return "V";
break;
case 22:
return "W";
break;
case 23:
return "X";
break;
case 24:
return "Y";
break;
case 25:
return "Z";
break;
case 26:
return "a";
break;
case 27:
return "b";
break;
case 28:
return "c";
break;
case 29:
return "d";
break;
case 30:
return "e";
break;
case 31:
return "f";
break;
case 32:
return "g";
break;
case 33:
return "h";
break;
case 34:
return "i";
break;
case 35:
return "j";
break;
case 36:
return "k";
break;
case 37:
return "l";
break;
case 38:
return "m";
break;
case 39:
return "n";
break;
case 40:
return "o";
break;
case 41:
return "p";
break;
case 42:
return "q";
break;
case 43:
return "r";
break;
case 44:
return "s";
break;
case 45:
return "t";
break;
case 46:
return "u";
break;
case 47:
return "v";
break;
case 48:
return "w";
break;
case 49:
return "x";
break;
case 50:
return "y";
break;
case 51:
return "z";
break;
case 52:
return "0";
break;
case 53:
return "1";
break;
case 54:
return "2";
break;
case 55:
return "3";
break;
case 56:
return "4";
break;
case 57:
return "5";
break;
case 58:
return "6";
break;
case 59:
return "7";
break;
case 60:
return "8";
break;
case 61:
return "9";
break;
case 62:
return "+";
break;
case 63:
return "/";
break;
}
}
function base64decode(bits){
switch(bits){
case "A":
return "0";
break;
case "B":
return "1";
break;
case "C":
return "2";
break;
case "D":
return "3";
break;
case "E":
return "4";
break;
case "F":
return "5";
break;
case "G":
return "6";
break;
case "H":
return "7";
break;
case "I":
return "8";
break;
case "J":
return "9";
break;
case "K":
return "10";
break;
case "L":
return "11";
break;
case "M":
return "12";
break;
case "N":
return "13";
break;
case "O":
return "14";
break;
case "P":
return "15";
break;
case "Q":
return "16";
break;
case "R":
return "17";
break;
case "S":
return "18";
break;
case "T":
return "19";
break;
case "U":
return "20";
break;
case "V":
return "21";
break;
case "W":
return "22";
break;
case "X":
return "23";
break;
case "Y":
return "24";
break;
case "Z":
return "25";
break;
case "a":
return "26";
break;
case "b":
return "27";
break;
case "c":
return "28";
break;
case "d":
return "29";
break;
case "e":
return "30";
break;
case "f":
return "31";
break;
case "g":
return "32";
break;
case "h":
return "33";
break;
case "i":
return "34";
break;
case "j":
return "35";
break;
case "k":
return "36";
break;
case "l":
return "37";
break;
case "m":
return "38";
break;
case "n":
return "39";
break;
case "o":
return "40";
break;
case "p":
return "41";
break;
case "q":
return "42";
break;
case "r":
return "43";
break;
case "s":
return "44";
break;
case "t":
return "45";
break;
case "u":
return "46";
break;
case "v":
return "47";
break;
case "w":
return "48";
break;
case "x":
return "49";
break;
case "y":
return "50";
break;
case "z":
return "51";
break;
case "0":
return "52";
break;
case "1":
return "53";
break;
case "2":
return "54";
break;
case "3":
return "55";
break;
case "4":
return "56";
break;
case "5":
return "57";
break;
case "6":
return "58";
break;
case "7":
return "59";
break;
case "8":
return "60";
break;
case "9":
return "61";
break;
case "+":
return "62";
break;
case "/":
return "63";
break;
}
}
upload.js
function readFile(evt) {
var file = (evt.target.files)[0];
var r = new FileReader();
r.onload = (function(file) {
return function(e) {
var contents = e.target.result;
console.log(contents);
process(contents);
};
})(file);
r.readAsDataURL(file);
}
document.getElementById('fileinput').addEventListener('change', readFile, false);
function process(content){
content = content.split(";base64,")[1];
console.log(content);
for(i=0; i < content.length;i++){
console.log(base64decode(content[i]));
}
}