75341


プログラム内で使っているTypedArrayをファイルに保存して、後に読み込みたいのですが下のようなコードでは期待する動作になりません。  
何が問題でどのように解決すればよいのでしょうか？

[code]

    const fs = require('fs')
    
    const i32arr = new Int32Array([255, 256])
    // Int32Array [ 255, 256 ]
    console.log(i32arr)
    
    fname = 'hoge'
    fs.writeFileSync(fname, i32arr)
    const buf = fs.readFileSync(fname)
    const i32arr2 = new Int32Array(buf)
    // Int32Array [ 255, 0, 0, 0, 0, 1, 0, 0 ]と表示される
    // ここで [ 255, 256 ]と表示されてほしい
    console.log(i32arr2)
    
[/code]


CC BY-SA 4.0
2021-04-17T08:06:17.877
75339
2021-04-18T07:30:29.123
44853
question
javascript node.js
NodeJSでTypedArrayをファイルに保存して後に読み込みたい


コンストラクタを下記のように書き換えると正しく動作します。

変更前: `new Int32Array(buf)`  
変更後: `new Int32Array(buf.buffer, buf.byteOffset, buf.byteLength /
Int32Array.BYTES_PER_ELEMENT)`

バイナリファイルの書き出しはご質問の`fs.WriteFileSync`で問題ありません。  
[`fs.ReadFileSync`](https://nodejs.org/docs/latest-v13.x/api/fs.html#fs_fs_readfilesync_path_options)の戻り値が[`Buffer`](https://nodejs.org/docs/latest-v13.x/api/buffer.html#buffer_class_buffer)である点がポイントです。

公式ドキュメントの[`Buffers and
TypedArrays`](https://nodejs.org/docs/latest-v13.x/api/buffer.html#buffer_buffers_and_typedarrays)を読むと冒頭の変換処理が必要だと記述されています。  
`Buffer`は[`Uint8Array`](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)の性質を持っているため new
_TypedArray_ ( _Buffer_ ) してもうまく動作しないことが原因です。

本家SOの類似回答:  
[Convert a binary NodeJS Buffer to JavaScript
ArrayBuffer](https://stackoverflow.com/a/31394257/8248751)

日本語の関連ブログ:  
[ArrayBuffer と TypedArray
でバイナリデータを扱う](https://numb86-tech.hatenablog.com/entry/2019/05/12/134052)


CC BY-SA 4.0
2021-04-17T10:01:15.603
75341
2021-04-18T07:30:29.123
2021-04-18T07:30:29.123
3060
9820
75339
answer