JS не экспортирует двоичный файл base64, как предполагалось - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь преобразовать биты в 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]));

    }

}
...