[Ruby] Как разобрать двоичный файл?

Dennis Vshivkov walrus на amur.ru
Сб Янв 15 02:49:27 MSK 2005


On Fri, Jan 14, 2005 at 10:40:57PM +0300, Тим Алексеевский wrote:

 >> Телефония.
 >> Имеем некий файлик с разговорами с коммутатора. Запись = 187 байт. 
 >> Разнесены они по разным полям.
 >> Записей - может быть сколько угодня
 >> Требуется наваять парсер.
 >> Вопрос такий:
 >> 1. Как считывать по 187 байт
 >   f=File.new("testfile")
 >   s=r.read(187)

 > (после этого еще проверить, что s длиной 187, может быть меньше,
 > "если не хватает")

$ ls -l txt
-rw-rw-r--  1 walrus walrus 685 Dec  6 15:05 txt
$ ruby -rreadbytes -e 'loop { puts $stdin.readbytes(187).size }' < txt
187
187
187
/usr/lib/ruby/1.8/readbytes.rb:21:in `readbytes': data truncated (TruncatedDataError)
        from -e:1
        from -e:1:in `loop'
        from -e:1

 >> 2. Как из затолкать в некую структуру, что сразу поля получились?
 >>  Типа первые 4 туда, вторые 4 - сюда, потом 8 еще воооон туда
 >   может unpack?
 >   Например:
 >   a=s.unpack("llq")

 >   (получится массив, его можно в hash распихать если нужно)
 >   t=["first-4", "second-4", "third-8"]
 >   h={}
 >   a.each_with_index{|v,i| h[t[i]]=v}

 >   (теперь первое поле например будет доступно как h["first-4"])

h = {}
loop {
  h[:foo], dummy, h[:bar] = $stdin.readbytes(187).unpack("NNS")
  p h
}

-- 
/Awesome Walrus <walrus на amur.ru>
                                   ...И стал человек человеком во имя любви...


Подробная информация о списке рассылки Ruby