バイナリを数値に変換する

この日記でWAVEファイルのサイズだけ取り出してみた. だけどどう変換してもサイズがおかしいなぁー, ってなった.

んで, 調べてみたら上位ビットから順番に格納されているワケじゃないのね. 下位ビットから順番に入っているとのコト. コレLittle Endian. 名前は知っていたけど, そういうコトね!

ちなみに上位から順番に入っているのはBig Endian. そのまんまだね!

で変換関数. 別モジュールにしてあるけど, 実際は同じファイル(モジュール)に書いてあります.

-module(conv).
-export([binary_to_int/1]).

binary_to_int(Bin) ->
    binary_to_int(lists:reverse(binary_to_list(Bin)), 0).

binary_to_int([], Result) ->
    Result;

binary_to_int([B|Bytes], Result) ->
    binary_to_int(Bytes, Result * 256 + B).

erlでシェルでも立ち上げて試してみる.

$ c(conv).
ok
$ conv:binary_to_int(<<3, 2, 1>>).
66051

できた! Little Endian専用だけど!