莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Ruby處理二進制

          Posted on 2008-01-25 18:56 dennis 閱讀(1679) 評論(0)  編輯  收藏 所屬分類: 動態語言
              分析二進制協議或者存取二進制文件是個很常見的需求,Ruby的IO提供了對二進制的讀操作,但是寫入卻只提供字符。并且讀的操作也比較笨拙,例如,在c里面的話,我們一般是定義個struct,然后:

          fread(record, sizeof(record), 1, stream);

          在java里,也是比較容易,特別是nio引入了ByteBuffer之后就更方便了。Ruby的話,我得自己確定讀多少個字節,并自己“組裝”成原始數據,這顯然太麻煩了,幸好,我們有bit-struct :)
              到主頁下載,解壓之后參照README安裝下就OK了。使用的話,也是先定義結構,然后new就行了:
          require 'bit-struct'
          class Message < BitStruct
              signed :msg_length,
          32
              
          char   :type,24
              signed :uid,
          32
              unsigned :cmd,
          16
              rest  :body
          end
          msg
          =Message.new
          file.read(msg)
          p msg.inspect

          bit-struct支持float,char,unsigned,signed,text,pad,nest,oct,hex,其中nest用于聲明一個嵌套結構,例如:
          class Sub < BitStruct
              unsigned :x,    
          8
           end

          class A < BitStruct
              nest    :n,  Sub
          end

          = A.new
          p a  
          # ==> #<A n=#<Sub x=0>>

          如果你看下源碼的話,會發現BitStruct繼承String類,因此IO可以直接將BitStruct寫入文件,內部自動幫你處理轉換細節。

          主站蜘蛛池模板: 沿河| 盐山县| 乌海市| 乐业县| 乡宁县| 汽车| 石首市| 葫芦岛市| 丰县| 甘洛县| 厦门市| 天祝| 邹平县| 大渡口区| 新晃| 无为县| 淮南市| 龙门县| 博白县| 会同县| 德保县| 石狮市| 高密市| 灵璧县| 历史| 达日县| 黎平县| 当涂县| 宁强县| 天门市| 大连市| 彰化县| 阳江市| 科技| 大悟县| 民丰县| 牙克石市| 饶平县| 霍城县| 阿巴嘎旗| 崇礼县|