如何将图像文件转换为base 2二进制文件?

时间:2017-10-09 16:57:20

标签: javascript math binary

我试图这样做:



function handleFiles(files) {
  var selectedFile = files[0];
  var reader = new FileReader();
  reader.readAsBinaryString(selectedFile);
  reader.onloadend = function() {
    var result = reader.result;
    convert(result);
  };
}

function convert(data) {
  var img = document.createElement("img");
  var result = data.toString(2);
  
  document.body.appendChild(img);
  img.src = 'data:image/jpeg;base64,' + btoa(data); // this works
  
  console.log("Base ?: " + data); // not sure, I think 16 or more likely 64, 
                                  // the MDN documentation doesn't specify what base of binary is produced by the readAsBinaryString method
  console.log("Base 2: " + result); // not base 2 binary data as expected
}

<input type="file" id="input" onchange="handleFiles(this.files)">
&#13;
&#13;
&#13;

此代码将jpeg转换为二进制数据,然后呈现它,但它不首先转换为base 2二进制。如果你运行该代码并查看日志,那就更多了(我对基础和二进制这个主题很天真,但我的猜测是基数为16或64)。我认为toString(2)应该转换为基数2,但它似乎并没有这样做。在将其转换回base 64之前,我想将二进制数据转换为基数2进行实验。

2 个答案:

答案 0 :(得分:0)

二进制文件总是基数为2,这就是“二进制”中的“bi”意思。

当你致电fileReader.readAsBinaryString()时,它会返回二进制文件;字符串可以存储二进制文件,因为它们实际上只是一个字符数组。

显示字符串是一系列零和1,它将是不同的ASCII字符(字母,数字,符号等)的混杂,因为它们是匹配的等效字符二进制值。

此外,您不需要以下行,因为您传入的data已经是字符串。

var result = data.toString(2);

答案 1 :(得分:0)

难道你不能单步执行二进制字符串并将每个字符转换为二进制表示形式吗?

function convert(data) { 
    var result = ''
    for (let i = 0; i < data.length; i++){
        result += data.charCodeAt(i).toString(2)
    }
    console.log(result)
  }

[我先用小文件测试一下。它会向控制台写很多内容,如您所想[]

编辑 - 抱歉,没想到你想来回走动。如果你想从二进制字符串回到其他东西,你可能想要用零填充二进制文件,这样你就可以一次拔出8位(或其他):

function convert(data) {
    var result = ''
    for (let i = 0; i < data.length; i++){
       // pad to make all binary string parts 8 bits long 
       result += data.charCodeAt(i).toString(2).padStart(8, 0)
    }
    return result
    }

function makeBuffer(string){
    buffer = ''
    for(let i = 0; i < string.length/8; i++){
        let stIdx = i*8
        // maybe a way to do this without the slice? dunno.
        buffer += String.fromCharCode(parseInt(string.slice(stIdx,stIdx+8), 2))
    }
    return buffer
}