莊周夢蝶

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

          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寫入文件,內部自動幫你處理轉換細節。

          主站蜘蛛池模板: 昆山市| 梁平县| 清徐县| 雅安市| 太保市| 福贡县| 霍林郭勒市| 鄯善县| 卢氏县| 岳普湖县| 辽源市| 武平县| 南康市| 洞口县| 富顺县| 开阳县| 文山县| 仙桃市| 常宁市| 安庆市| 庆安县| 视频| 平昌县| 嘉兴市| 满洲里市| 久治县| 龙南县| 紫云| 宜昌市| 涞源县| 天水市| 广饶县| 都安| 虹口区| 昂仁县| 玉田县| 金乡县| 田东县| 大荔县| 六安市| 福安市|