27
BinDataバイナリデータを 楽に扱う shuzo_kino

BinDataで バイナリデータを 楽に扱う

Embed Size (px)

Citation preview

Page 1: BinDataで バイナリデータを 楽に扱う

BinDataでバイナリデータを

楽に扱うshuzo_kino

Page 2: BinDataで バイナリデータを 楽に扱う

お品書き

1. 自己紹介

2. Bindataとは?

3. Bindataの基礎構文

4. Bindataの強み

5. さいごに

Page 3: BinDataで バイナリデータを 楽に扱う

自己紹介

Twitter: @shuzo_kino

ゆるふわ零細事業主(情報系)

電気通信大学を8年かけて卒業

Page 4: BinDataで バイナリデータを 楽に扱う

自己紹介:個人技術ブログ

ByeByeMoore

現在、連続更新記録356日

……後少しで一年毎日更新

http://shuzo-kino.hateblo.jp/

Page 5: BinDataで バイナリデータを 楽に扱う

お品書き

1. 自己紹介

2. Bindataとは?

3. Bindataの基礎構文

4. Bindataの強み

5. さいごに

Page 6: BinDataで バイナリデータを 楽に扱う

シリアルからデータを読むと、

こんな文字列がきます。

"~ \u0004 abcd @"

Page 7: BinDataで バイナリデータを 楽に扱う

"~ \u0004 abcd @"

開始文字

データ長

データ本体

終了文字

Page 8: BinDataで バイナリデータを 楽に扱う

さて、これを

どう分けましょう?

Page 9: BinDataで バイナリデータを 楽に扱う

間に合わせで書くと、

こんな感じ?

"~\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で バイナリデータを 楽に扱う

こんな時は、

BinDataを

使うと楽です

Page 11: BinDataで バイナリデータを 楽に扱う

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で バイナリデータを 楽に扱う

こんな感じで格納されます

{:head=>126, :len=>4, :str=>"abcd", :tail=>64}

Page 13: BinDataで バイナリデータを 楽に扱う

読み込みも、

通常のRubyな感覚で大丈夫。

アレコレデータを整形する際も

苦労しません。

a = SampleBase.read("~\u0004abcd@")puts a.str[0] + a.str[-1] #=> “ad”

Page 14: BinDataで バイナリデータを 楽に扱う

お品書き

1. 自己紹介

2. Bindataとは?

3. Bindataの基礎構文

4. Bindataの強み

5. さいごに

Page 15: BinDataで バイナリデータを 楽に扱う

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で バイナリデータを 楽に扱う

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で バイナリデータを 楽に扱う

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で バイナリデータを 楽に扱う

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で バイナリデータを 楽に扱う

お品書き

1. 自己紹介

2. Bindataとは?

3. Bindataの基礎構文

4. Bindataの強み

5. さいごに

Page 20: BinDataで バイナリデータを 楽に扱う

急で悪いんだけどさー

センサの種類が

変わったんだよね〜

Page 21: BinDataで バイナリデータを 楽に扱う

具体的には、こうなった

"~ \u0004 \u0042\u0011\u0012\u0000 @"

ACIIがビット列になった(怒

Page 22: BinDataで バイナリデータを 楽に扱う

大丈夫。

BinDataならスグです

Page 23: BinDataで バイナリデータを 楽に扱う

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で バイナリデータを 楽に扱う

読み込みも引き続き問題なし。

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で バイナリデータを 楽に扱う

お品書き

1. 自己紹介

2. Bindataとは?

3. Bindataの基礎構文

4. Bindataの強み

5. さいごに

Page 26: BinDataで バイナリデータを 楽に扱う

BinDataを使えば、

コロコロ変わるパケットにも容

易に対処可能!

ガンガン使ってきましょう!

Page 27: BinDataで バイナリデータを 楽に扱う