投稿者 tel | 2012年6月30日

JavaScriptでfloatをbase64変換する

モデルのJSONに含まれる浮動少数データを圧縮できないかと思って、floatの配列をbase64変換してみることにした。

node.jsを使用する。

var data = [0.1, 0.2, 0.3, 0.4],
    f = new Float32Array(data), // floatの配列
    b = new Uint8Array(f.buffer), // f の配列を参照する byte配列
    buffer = new Buffer(b);
console.log(buffer.toString('base64')); // zczMPc3MTD6amZk+zczMPg==

node.jsのBufferクラスのtoStringにbase64を渡すとbase64の文字列が取得できる。Bufferクラスに渡すことができるのはどうやら0から255までの値の配列っぽいので、浮動少数の値をTyped Arrayに突っ込んでバイト配列に変換して渡した。
Typed Arrayのコンストラクタに別のTyped Arrayのbuffer(Array Buffer)を渡してあげるとバイナリ部分を参照できる。

var buffer = new Buffer('zczMPc3MTD6amZk+zczMPg==', 'base64'),
    b = new Uint8Array(buffer),
    f = new Float32Array(b.buffer),
    data = Array.prototype.slice.call(f, 0);
console.log(data); // [ 0.10000000149011612, 0.20000000298023224, 0.30000001192092896, 0.4000000059604645 ]

floatに戻すときにはBufferのコンストラクタでbase64指定してあとは逆の方法で戻せばOK。doubleからfloatにしてしまっているので制度が悪くなってるみたい。

Typed Arrayのリファレンス
https://developer.mozilla.org/ja/JavaScript_typed_arrays

node.jsのBufferのリファレンス
http://nodejs.jp/nodejs.org_ja/docs/v0.8/api/buffer.html


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。