JavaScriptでバイナリデータを扱う方法について調べた

追記アリ(2010/11/19)

はじめに

今回は以下の2つ、

  1. JavaScriptでバイナリデータの生成
  2. 生成したデータをWebSocketでサーバに送信

がしたかったので、JavaScriptでバイナリデータを扱う方法について調べてみました。
メモ書き程度の内容ですが、調べた結果を記事にまとめてみました。実行環境は以下の通りです。

バイナリデータの生成

今回は『0x00 0x01 0x75 0xF0 0xFF』という5バイトのバイナリデータを生成してみます。

var dataArray = [0x00, 0x01, 0x75, 0xF0, 0xFF];  // 1バイトづつ配列の要素として保持する
//alert(typeof(dataArray));  => "object"
//alert(dataArray.length);  => 5
var binaryData = String.fromCharCode.apply(this, dataArray);  // 5バイトのバイナリデータの生成
//alert(typeof(binaryData));  => "string"
//alert(binaryData.length); => 5
alert(binaryData);

最後のalert()の結果は以下のようになりました。

ChromeFirefoxで表示内容が少し違いますが、変数binaryDataにはそれっぽいデータが入っているようです。

WebSocketサーバ側のプログラム

上記の方法でバイナリデータっぽいものが出来たので、次はこのデータを受信して保存するプログラムを作成します。今回はnode.jsnode-websocket-serverを使いました。

var sys = require('sys');
var ws = require('./node-websocket-server/lib/ws');
var fs = require("fs");
var server = ws.createServer();
var filename = "binary.dat";  // 受信したデータを保存するファイル
server.addListener("connection", function(conn){
    sys.log("connected as: " + conn.id);
    conn.addListener("message", function (msg) {
        sys.log("recieved message: " + msg);
        // 受信したデータをローカルファイルに書きだす
        fs.writeFile(filename, msg, encode="binary", function (err) {
            if (err) throw err;
            sys.log("It's saved!");
        });
    });
});

server.listen(8000);

このプログラムは、WebSocketで受信したデータをバイナリとしてローカルファイルbinary.datに保存します。

WebSocketでデータを送信する

上記のサーバ側のプログラムを動かしたら、以下のようなコードでWebSocketサーバの8000番ポートに対してバイナリデータを送信します。

var ws = new WebSocket("ws://localhost:8000");
ws.send(binaryData);
ws.close();

受信したデータを調べる

サーバ側のプログラムの実行結果が以下のようになれば、ローカルファイルbinary.datに受信したデータが書きこまれていると思います。

15 Nov 17:10:18 - connected as: 7323540100
15 Nov 17:10:20 - recieved message: u〓〓
15 Nov 17:10:20 - It's saved!

binary.datの中身はバイナリデータなのでhexdumpコマンドで中身を確認してみます。

% hexdump binary.dat
0000000 00 01 75 f0 ff                                 
0000005

5バイトのデータ『0x00 0x01 0x75 0xF0 0xFF』が保存されていることが確認できました。

おわりに

実は、今回の方法は『何となくそれっぽいコードを書いたらそれっぽい実行結果が得られた』って感じで、なぜこういう事が出来るのかは理解してないです(+_+;)
バイトオーダーとかってどうなってるのでしょうか?というかこのやり方は適切な方法なんでしょうか?(;一_一)ウーン...


追記(2010/11/19):
id:koichik さんからコメントを頂きました。上記の方法では、たまたまバイナリデータが保存できたようです。ですが、今後(node.jsでbinaryエンコーディングが廃止された場合)は上記の方法ではできなくなると思います/(^o^)\ナンテコッタイ