bindataで バイナリデータを 楽に扱う
TRANSCRIPT
![Page 1: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/1.jpg)
BinDataでバイナリデータを
楽に扱うshuzo_kino
![Page 2: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/2.jpg)
お品書き
1. 自己紹介
2. Bindataとは?
3. Bindataの基礎構文
4. Bindataの強み
5. さいごに
![Page 3: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/3.jpg)
自己紹介
Twitter: @shuzo_kino
ゆるふわ零細事業主(情報系)
電気通信大学を8年かけて卒業
![Page 4: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/4.jpg)
自己紹介:個人技術ブログ
ByeByeMoore
現在、連続更新記録356日
……後少しで一年毎日更新
http://shuzo-kino.hateblo.jp/
![Page 5: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/5.jpg)
お品書き
1. 自己紹介
2. Bindataとは?
3. Bindataの基礎構文
4. Bindataの強み
5. さいごに
![Page 6: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/6.jpg)
シリアルからデータを読むと、
こんな文字列がきます。
"~ \u0004 abcd @"
![Page 7: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/7.jpg)
"~ \u0004 abcd @"
開始文字
データ長
データ本体
終了文字
![Page 8: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/8.jpg)
さて、これを
どう分けましょう?
![Page 9: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/9.jpg)
間に合わせで書くと、
こんな感じ?
"~\u0004abcd@".unpack("C*").map.with_index{|x,idx| (2..5).include?(idx) ? x.chr : x}
#=> [126, 4, "a", "b", "c", "d", 64]
いくらでも複雑になりそう……
![Page 10: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/10.jpg)
こんな時は、
BinDataを
使うと楽です
![Page 11: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/11.jpg)
require 'bindata'
class SampleBase < BinData::Record endian :big uint8 :head uint8 :len string :str, :read_length => :len uint8 :tailend
p SampleBase.read("~\u0004abcd@")
![Page 12: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/12.jpg)
こんな感じで格納されます
{:head=>126, :len=>4, :str=>"abcd", :tail=>64}
![Page 13: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/13.jpg)
読み込みも、
通常のRubyな感覚で大丈夫。
アレコレデータを整形する際も
苦労しません。
a = SampleBase.read("~\u0004abcd@")puts a.str[0] + a.str[-1] #=> “ad”
![Page 14: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/14.jpg)
お品書き
1. 自己紹介
2. Bindataとは?
3. Bindataの基礎構文
4. Bindataの強み
5. さいごに
![Page 15: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/15.jpg)
require 'bindata'
class SampleBase < BinData::Record endian :big uint8 :head uint8 :len string :str, :read_length => :len uint8 :tailend
p SampleBase.read("~\u0004abcd@")
Gem “bindata”を導入します。
![Page 16: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/16.jpg)
require 'bindata'
class SampleBase < BinData::Record endian :big uint8 :head uint8 :len string :str, :read_length => :len uint8 :tailend
p SampleBase.read("~\u0004abcd@")
普通に使う分には、BinData::Recordを継承するだけで十分実用に足ります
![Page 17: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/17.jpg)
require 'bindata'
class SampleBase < BinData::Record endian :big uint8 :head uint8 :len string :str, :read_length => :len uint8 :tailend
p SampleBase.read("~\u0004abcd@")
エンディアンの指定も可能です。要素毎の設定も容易。
![Page 18: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/18.jpg)
require 'bindata'
class SampleBase < BinData::Record endian :big uint8 :head uint8 :len string :str, :read_length => :len uint8 :tailend
p SampleBase.read("~\u0004abcd@")
ビット列と文字が混在可能!
![Page 19: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/19.jpg)
お品書き
1. 自己紹介
2. Bindataとは?
3. Bindataの基礎構文
4. Bindataの強み
5. さいごに
![Page 20: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/20.jpg)
急で悪いんだけどさー
センサの種類が
変わったんだよね〜
![Page 21: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/21.jpg)
具体的には、こうなった
"~ \u0004 \u0042\u0011\u0012\u0000 @"
ACIIがビット列になった(怒
![Page 22: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/22.jpg)
大丈夫。
BinDataならスグです
![Page 23: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/23.jpg)
require 'bindata'
class SampleBase < BinData::Record endian :big uint8 :head uint8 :len array :body, :type => :uint8, :initial_length => :len uint8 :tailend
p SampleBase.read("~\u0004\u0042\u0011\u0012\u0000 @")
型を変換するだけ
![Page 24: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/24.jpg)
読み込みも引き続き問題なし。
a = SampleBase.read("~\u0004\u0042\u0011\u0012\u0000@")puts a.body[0] + a.body[-1] #=> 66
\uは16進数表記なので 0x42 + 0x12 = 0x54 = 66
![Page 25: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/25.jpg)
お品書き
1. 自己紹介
2. Bindataとは?
3. Bindataの基礎構文
4. Bindataの強み
5. さいごに
![Page 26: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/26.jpg)
BinDataを使えば、
コロコロ変わるパケットにも容
易に対処可能!
ガンガン使ってきましょう!
![Page 27: BinDataで バイナリデータを 楽に扱う](https://reader030.vdocuments.net/reader030/viewer/2022020100/58ee24801a28ab5a798b45a5/html5/thumbnails/27.jpg)