Ruby的好用method: unpack & pack

在處理各種格式的檔案或是封包的時候,常常需要對bit level的東西做運算,這時候如果還利用character或是string慢慢在腦中轉換的話,真的很痛苦。剛好最近要做存取BMP格式圖片的東西…就順便看了一下String.unpack跟Array.pack這兩個method。

1. unpack

unpack這個method的用途是將讀入的字串依據指定的格式(Format)拆開,實際的用法有點複雜,先看這個例子:

 "ABC".unpack('CCC' ) # [65, 66, 67]

在這裡作為參數的Format是’CCC’。根據說明文件,’C’代表的是「取出一個字元,並視為unsigned integer」(extract a character as an unsigned integer),回傳的是Fixnum。所以三個’C’就代表要將字串拆成三個字元,並且用無號整數來表示。更實際的用法像是,Bitmap的File Header是最前面的14個byte。那我們就可以這樣讀取:

source = File.open(File_name, "rb" )
bitmap_header = source.read(14)
bitmap_header.unpack("a2LSSL" ) 
#['BM',61254,0,0,54]

在這裡的format中,a代表一個character,後面接著2代表兩次,也就是要讀出兩個字元。接著L代表「將連續四個character視為一個unsigned long integer。」S則是「將兩個連續的character是唯一個unsigned short integer。」因此,我們只要利用這個format做unpack之後,就可以正確的將這14個byte整理成我們要的資料了!

2. pack

pack其實就是unpack的相反動作,unpack是將字串依據format拆成陣列,pack則是將陣列(array)依據format組合成一個字串:

 [65,66,67].pack('CCC' ) # "ABC"

詳細的format格式請參考API文件:unpackpack。總之,當需要對byte層級,甚至是bit層級做處理的時候,不用自己慢慢算了,直接利用這兩個好用的method吧!

Advertisements

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s