Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

828 views

Published on

バイナリっぽいデータを取り扱うGem「BinData」で色々楽をしよう。
見た目、C言語の構造体っぽい定義で後はRuby風味の使い勝手。

Published in: Technology
  • Login to see the comments

  • Be the first to like this

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

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

×