想定読者
バイナリについて知らない方
elixirでバイナリってどう扱うのか知りたい方
知識編
バイナリとは?
コンピュータはすべての情報を2進数の「0」と「1」が並んだビット列として表現する。このうち、何らかの文字コード規格に基づいて文字を表すデータを「テキストデータ」(テキスト形式)、そうでないものを「バイナリデータ」(バイナリ形式)と分類
バイナリ形式のデータの例としては画像や音声、動画などを記録したメディアデータ、実行可能形式のコンピュータプログラム(オブジェクトコード/バイナリコード)、圧縮データ、暗号データなど
バイナリを扱う経験が乏しいので想像になるが暗号データや圧縮データの取り扱いの際に重要視される?
(詳しい方がいたらコメントででも教えていただけるととても助かります。)
実践編
バイナリをelixirで操ってみます
elixirはインストール済みと想定し、iexを実行しシェルを立ち上げます
iex
is_binary
バイナリかどうかを調べてくれる関数
iex>is_binary("hello")
true
iex>is_binary(2)
false
"hello"は文字列だがバイナリとして処理されるが、2はバイナリとして処理されないのが確認できる
byte_size
バイトサイズを調べてくれる関数
iex> byte_size("ほげほげ")
12
iex> byte_size("hogehoge")
8
日本語の"ほげほげ"は4文字だがバイトサイズだと12文字換算となる
これはひらがなのコードポイントが大きいため1バイトで処理されていないためと考えられる
対して"hogehoge"は8文字だがバイトサイズ換算だと8文字換算となる
コードポイントが1バイト(0から255)でおさまるためだと考えられる
?
?と文字を入れることでコードポイントの特定ができる
一文字ずつしか使えないことに注意する
iex(5)> ?ほげほげ
** (SyntaxError) invalid syntax found on iex:5:3:
error: syntax error before: 'げほげ'
│
5 │ ?ほげほげ
│ ^
│
└─ iex:5:3
(iex 1.17.3) lib/iex/evaluator.ex:295: IEx.Evaluator.parse_eval_inspect/4
(iex 1.17.3) lib/iex/evaluator.ex:187: IEx.Evaluator.loop/1
(iex 1.17.3) lib/iex/evaluator.ex:32: IEx.Evaluator.init/5
(stdlib 6.1.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
iex(5)> ?ほ
12411
iex(6)> ?げ
12370
iex(7)> ?h
104
iex(8)> ?o
111
iex(9)> ?g
103
iex(10)> ?e
101
先ほどのバイトサイズでの予想が合致しているのがわかる
疑問点
文字列は知識編で調べたテキストデータではないのか?
テキストデータとバイナリデータの切り分けがうまくできていない
後日判明し次第追記を行う
参考サイト