NodeJSバイナリバッファーをJavaScriptArrayBufferに変換するにはどうすればよいですか?
13 に答える
のインスタンスBuffer
Uint8Array
は、node.js 4.x 以降の のインスタンスでもあります。したがって、最も効率的な解決策は、https://stackoverflow.com/a/31394257/1375574buf.buffer
に従ってプロパティに直接アクセスすることです。他の方向に進む必要がある場合、Buffer コンストラクターは ArrayBufferView 引数も受け取ります。
これはコピーを作成しないことに注意してください。つまり、ArrayBufferView への書き込みは元の Buffer インスタンスに書き込まれます。
古いバージョンでは、node.js には v8 の一部として両方の ArrayBuffer がありますが、Buffer クラスはより柔軟な API を提供します。ArrayBuffer を読み書きするには、ビューを作成してコピーするだけです。
Buffer から ArrayBuffer へ:
function toArrayBuffer(buf) {
const ab = new ArrayBuffer(buf.length);
const view = new Uint8Array(ab);
for (let i = 0; i < buf.length; ++i) {
view[i] = buf[i];
}
return ab;
}
ArrayBuffer からバッファへ:
function toBuffer(ab) {
const buf = Buffer.alloc(ab.byteLength);
const view = new Uint8Array(ab);
for (let i = 0; i < buf.length; ++i) {
buf[i] = view[i];
}
return buf;
}
「ArrayBuffer から Buffer へ」は、次の方法で実行できます。
var buffer = Buffer.from( new Uint8Array(ab) );
次の優れた npm パッケージを使用してください: to-arraybuffer
.
または、自分で実装することもできます。バッファが呼び出されている場合は、次buf
のようにします。
buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)
ArrayBuffer
は型付きの と考えることができますBuffer
。
したがって、ArrayBuffer
常に型 (いわゆる「配列バッファー ビュー」) が必要です。通常、Array Buffer ViewのタイプはUint8Array
またはUint16Array
です。
ArrayBuffer と String の間の変換に関する Renato Mangini の優れた記事があります。
コード例 (Node.js の場合) に重要な部分をまとめました。ArrayBuffer
また、typedと untyped の間で変換する方法も示しますBuffer
。
function stringToArrayBuffer(string) {
const arrayBuffer = new ArrayBuffer(string.length);
const arrayBufferView = new Uint8Array(arrayBuffer);
for (let i = 0; i < string.length; i++) {
arrayBufferView[i] = string.charCodeAt(i);
}
return arrayBuffer;
}
function arrayBufferToString(buffer) {
return String.fromCharCode.apply(null, new Uint8Array(buffer));
}
const helloWorld = stringToArrayBuffer('Hello, World!'); // "ArrayBuffer" (Uint8Array)
const encodedString = new Buffer(helloWorld).toString('base64'); // "string"
const decodedBuffer = Buffer.from(encodedString, 'base64'); // "Buffer"
const decodedArrayBuffer = new Uint8Array(decodedBuffer).buffer; // "ArrayBuffer" (Uint8Array)
console.log(arrayBufferToString(decodedArrayBuffer)); // prints "Hello, World!"
Float64Array に対して上記を試しましたが、うまくいきませんでした。
私は、実際にデータを正しいチャンクでビューに「INTO」する必要があることに気付きました。これは、ソース バッファから一度に 8 バイトを読み取ることを意味します。
とにかく、これは私が終わったものです...
var buff = new Buffer("40100000000000004014000000000000", "hex");
var ab = new ArrayBuffer(buff.length);
var view = new Float64Array(ab);
var viewIndex = 0;
for (var bufferIndex=0;bufferIndex<buff.length;bufferIndex=bufferIndex+8) {
view[viewIndex] = buff.readDoubleLE(bufferIndex);
viewIndex++;
}
NodeJS は、ある時点 (v0.6.x だったと思います) で ArrayBuffer をサポートしていました。ここで base64 エンコードとデコード用の小さなライブラリを作成しましたが、v0.7 に更新してから (NodeJS での) テストが失敗します。これを正規化するものを作ろうと思っているのですが、それまではNodeのネイティブBuffer
を使うべきだと思います。
私はすでにノードをバージョン 5.0.0 に更新しており、これを使用して作業しています。
function toArrayBuffer(buffer){
var array = [];
var json = buffer.toJSON();
var list = json.data
for(var key in list){
array.push(fixcode(list[key].toString(16)))
}
function fixcode(key){
if(key.length==1){
return '0'+key.toUpperCase()
}else{
return key.toUpperCase()
}
}
return array
}
これを使用して、vhd ディスク イメージを確認します。