2017-10-09 2 views
0

私はこのようにそれをやろうとしている:イメージファイルをベース2バイナリに変換するにはどうすればよいですか?

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)">

このコードは、それをレンダリングし、バイナリデータにJPEGに変換しますが、最初の2進をベースに変換されていません。あなたがそのコードを実行してログを見ると、それは何か(私はベースとバイナリの主題については素朴ですが、私の推測はベース16または64です)です。私はtoString(2)がベース2に変換されるはずですが、それはそうしていないようです。それをベース64に戻す前に、私は2進数のデータを実験のために基数2にしたいと思っています。

+0

私が読んだ:あなたが戻って何か他のものへのバイナリ文字列から取得したい場合は、一度に8ビット(または何を)引き出すことができますので、あなたはおそらくパッドにゼロのバイナリをお勧めしますこのオプションや代替オプションに関連するすべてのメソッドで見つけることができるすべてのドキュメントですが、私はそれを行う方法を理解できないようです。 –

答えて

0

バイナリ文字列をステップバイステップして各文字をバイナリ表現に変換できませんか?

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

[これは小さいファイルで最初にテストします。あなたが想像しているように、コンソールにたくさん書き込む]

EDIT - 申し訳ありませんが、あなたは行き​​来したいと思いました。

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 
} 
+0

ええ、私はその方法を試していましたが、それ以降はベース64に戻そうとするたびに失敗したので、間違っていると思いました。どのようにしてベース64に戻すことができますか?またそこからベース16に戻すと動作します。 –

+0

レンダリングのために 'btoa(result)'で再エンコードしたい場合、それは失敗しますが、これは私の問題です。 –

+0

あなたが往復を望んでいたことに気付かなかった!編集を参照してください。 –

0

バイナリは常に2の2進数で、バイナリの "bi"はこれを意味します。

fileReader.readAsBinaryString()に電話すると、バイナリが返されます。文字列は実際には文字の配列なのでバイナリを格納できます。

は0と一連の文字列ではなく、2進値と一致する同等の文字であるため、さまざまなASCII文字(文字、数字、記号など)が混在することになります。

また、渡しているdataが既に文字列であるため、次の行は必要ありません。

var result = data.toString(2); 
+0

私は実験的な目的のために、ベース2のバイナリ* accessible/visible *が必要です。それは理にかなっていますか?私はデータを調べ、すべての0と1を知りたいと思っています。バイナリはベース2ですが、ここではベース2には表現されません。データ構造をループして1と0を順次に出力する。 –

関連する問題