Posted By: Dion Mendel
Date: 2010-07-09 09:24
Summary: BinData 1.2.0
Project: BinData
= BinData is a declarative way to read and write structured binary data.
Most of the changes this release are behind the scenes improvements in execution time and memory usage.
The new user visible change is a new syntax sugar for creating nested records, arrays and choices. Here's a quick example:
class PointList < BinData::Record
. endian :big
. int32 :num
. array :points, :initial_length => :num do
. int16 :x
. int16 :y
. end
end
If you use BinData and have any comments, suggestions or questions, feel free to email me.
== What is BinData?
Do you ever find yourself writing code like this?
io = File.open(...)
len = io.read(2).unpack("v")
name = io.read(len)
width, height = io.read(8).unpack("VV")
puts "Rectangle #{name} is #{width} x #{height}"
It's ugly, violates DRY and feels like you're writing Perl, not Ruby.
Here's how you'd write the above using BinData.
class Rectangle < BinData::Record
. endian :little
. uint16 :len
. string :name, :read_length => :len
. uint32 :width
. uint32 :height
end
io = File.open(...)
r = Rectangle.read(io)
puts "Rectangle #{r.name} is #{r.width} x #{r.height}"
BinData supports all the data types you expect, including; arbitrarily sized/signed/endian integers, floats, bitstrings, strings, null terminated strings, dependent fields, arrays, choices, nested structures, and user defined structures. |
|