JavaScriptでバイナリデータを扱う方法について調べた
追記アリ(2010/11/19)
はじめに
今回は以下の2つ、
- JavaScriptでバイナリデータの生成
- 生成したデータをWebSocketでサーバに送信
がしたかったので、JavaScriptでバイナリデータを扱う方法について調べてみました。
メモ書き程度の内容ですが、調べた結果を記事にまとめてみました。実行環境は以下の通りです。
- Mac OS X 10.6.4
- Google Chrome 9.0.572.1 dev
- Firefox 4 beta 7
- node.js 0.2.4
- node-websocket-server 1.3.53
バイナリデータの生成
今回は『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);
ChromeとFirefoxで表示内容が少し違いますが、変数binaryDataにはそれっぽいデータが入っているようです。
WebSocketサーバ側のプログラム
上記の方法でバイナリデータっぽいものが出来たので、次はこのデータを受信して保存するプログラムを作成します。今回はnode.jsとnode-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^)\ナンテコッタイ