Webのデータフォーマットでは、テキストのJSONがよく使われますが、バイナリにしたMessagePackというデータを使った通信をテストしてみました。
参考: http://msgpack.org/
C言語でデータを作成したMessagePackデータを、Apache Webサーバに配置して、ブラウザで読み込みます。
上記サイトに各言語のライブラリが豊富にそろっているのでそれを利用しました。
Cは、ライブラリ付属のexample1.cを下記の部分変更しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
int main(void) { FILE *fh = NULL; cmp_ctx_t cmp; fh = fopen("cmp_data1.dat", "w+b"); cmp_init(&cmp, fh, file_reader, file_writer); cmp_write_array(&cmp, 4); cmp_write_str(&cmp, "Hello", 5); /*array:0*/ cmp_write_str(&cmp, "MessagePack", 11); /*array:1*/ cmp_write_integer(&cmp, 123); /*array:2*/ cmp_write_fixmap(&cmp, 1); /*array:3*/ cmp_write_fixstr(&cmp, "key01", 5); cmp_write_str(&cmp, "value01", 7); fclose(fh); return EXIT_SUCCESS; } |
念のためコマンドラインツールで、JSONデータに変換できることを確認します。
JavaScriptライブラリを使って、ページに読み込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<script src="./msgpack.min.js"></script> <script> function loadData(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = "arraybuffer"; xhr.onload = function() { var bytes = new Uint8Array(this.response); var data = msgpack.decode(bytes); console.log("data0 : " + data[0]); console.log("data1 : " + data[1]); console.log("data2 : " + data[2]); console.log("data3 : " + data[3].key01); }; xhr.send(); }; loadData("cmp_data1.dat") </script> |
データ確認はFirefoxアドインのFirebugを使いました。
JSONはWebだけでなく、いろいろなケースで使われるので、JSON <-> MessagePack変換は、ニーズがありそうです。
ツールダウンロード
https://github.com/camgunz/cmp
https://rawgit.com/kawanet/msgpack-lite/master/dist/msgpack.min.js
https://github.com/ludocode/msgpack-tools/releases