この記事は、Elixir Advent Calendar 2023 シリーズ14 の14日目です
【本コラムは、2分で読め、2分で試せます】
piacere です、ご覧いただいてありがとございます
Elixirのビットストリングって、バイナリデータを扱う際に便利ですが、「データのサイズ」をカウントする関数が、Bitwise
モジュールにありません
また、ビットストリングは Enumerable
プロトコルの実装では無いため、Enum
モジュールも使えません
iex> <<1, 2, 3>> |> Enum.count
** (Protocol.UndefinedError) protocol Enumerable not implemented for <<1, 2, 3>> of type BitString
(elixir 1.16.0) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir 1.16.0) lib/enum.ex:178: Enumerable.count/1
(elixir 1.16.0) lib/enum.ex:702: Enum.count/1
iex:18: (file)
今回、その解決+αをTIPSとしてまとめておきました
ビットストリングのカウント
ビットストリングのカウントは、Kernel
モジュールの下記でできます
iex> <<1, 2, 3>> |> byte_size
3
なおビットストリングは、ダブルクォートで囲まれた文字列と互換性があるため、String
モジュールを使うこともできます
iex> <<1, 2, 3>> |> String.length
3
逆も然りです
iex> "Xmasケーキ" |> byte_size
13
なおバイトサイズでは無く、ビットサイズを取得することもできます
iex> <<1, 2, 3>> |> bit_size
24
マルチバイト文字列だと、1文字3バイト使うので、4 x 8 + 3 x 3 x 8で104ビットとなります
iex> "Xmasケーキ" |> bit_size
104
型を指定すると、バイトサイズ/ビットサイズが変わります
iex> <<1::big-integer-size(64), 2::big-integer-size(128)>> |> byte_size
24
iex> _ |> bit_size
192