使用することはDataView
:
function ArrayBufferToBit(buffer) {
var dataView = new DataView(buffer);
var response = "", offset = (8/8);
// I assume we will read the entire file as a series of 8-bit integers,
// i.e. as a byte, hence my choice of offset.
for(var i = 0; i < dataView.byteLength; i += offset) {
response += dataView.getInt8(i).toString(2);
// toString is the secret sauce here.
}
return response;
}
Dataview
sがあなたが読み取り/数値データを書いてみましょう。 getInt8
は、バイト位置(ここでは0)からArrayBuffer
の値を符号付き8ビット整数表現に変換し、toString(2)
は8ビット整数を2進表現形式(つまり1と0の文字列)に変換します。
「マジック」オフセット値は、ファイルとして8ビットの整数として8ビットの整数表現でバイトとして格納されているとみなして得られます。バイト保存された(すなわち8ビットの)ファイルを32ビット整数に読み込もうとすると、32/8 = 4がバイトスペースの数であり、バイトオフセット値になります。
これは、配列を入力することに加えて、ArrayBuffer
から読み取り/書き込みするrecommended wayある:
ArrayBufferオブジェクトは、汎用、固定長の生のバイナリデータバッファを表すために使用されます。 ArrayBufferの内容を直接操作することはできません。その代わりに、型指定された配列オブジェクトの1つ、またはバッファを特定の形式で表すDataViewオブジェクトを作成し、それを使用してバッファの内容を読み書きします。符号付き8ビット表現に加えて
、あなたも(float64
あるいはint32
のような)表現の多様性を得ることができます。表現の選択は重要ではありません。toString(2)
はバイナリ形式で表示されます(ただし、バイナリ文字列の長さは明白な理由で必ず変更されます)。
この例では、ファイル全体を一連の8ビット整数、つまり1バイトずつ読み込むことを選択しました。しかし、一般的にDataView
は、の同種のタイプの混合を容易にします。最初の12バイトを32ビットの整数として、残りを64ビットとして読み取ることができます。 DataView
は通常、異なるファイル形式をこのように扱うことができ、DataView
も異なるアーキテクチャのファイルのエンディアンを処理するため、ファイルを処理するときに優先されます。
このようなタスクに@ le_mの回答のように、またはDataView
Sにより、型指定された配列で扱うことができます - 問題とは別のファイル(ファイルが別のCPUからネットワーク上で転送されている場合)ただし、DataView
sが両方のエンディアンを扱うことができますフォーマット(例:主な内容の前にいくつかのバイトヘッダーを持つPDFファイル)。
感謝。私はあなたの例でまだ何か間違っていると思う。 'dataView.getInt32(0).toString(2)'は私に結果として '1000111010010010100011000111000'を与えます。少し短く見えます... – Jules
@Jules私は改善し、何かより良いもので私の答えを更新しました。 –
@AkshatMahajan私は最近OPと同じ問題に遭遇しています。私はあなたの答えと説明に従います。それは私のような初心者のために良いと非常に詳細です。次に、私はバイナリ/ 16進数のデータを画面に表示するための完全なデモを書いています。しかし、私はこのバイナリハンドル領域には本当に新しいです。私は結果**を得ることができますが、理解しているか正しく行っているかわかりませんが、改善できるものは何でもありますか? [ここでフィドル](https://jsfiddle.net/69c5wcmL/1/)** – Lien