StructFu, a nifty way to leverage Ruby’s built in Struct class to create meaningful binary data.

Methods
B
C
L
S
T
Classes and Modules
Instance Public methods
body=(i)

Used like typecast(), but specifically for casting Strings to StructFu::Strings.

# File lib/packetfu/structfu.rb, line 24
        def body=(i)
                if i.kind_of? ::String
                        typecast(i)
                elsif i.kind_of? StructFu
                        self[:body] = i
                elsif i.nil?
                        self[:body] = StructFu::String.new.read("")
                else
                        raise ArgumentError, "Can't cram a #{i.class} into a StructFu :body"
                end
        end
clone()

Handle deep copies correctly. Marshal in 1.9, re-read myself on 1.8

# File lib/packetfu/structfu.rb, line 37
        def clone
                begin
                        Marshal.load(Marshal.dump(self))
                rescue
                        self.class.new.read(self.to_s)
                end
        end
len()

Alias for sz

set_endianness(e=nil)

Set the endianness for the various Int classes. Takes either :little or :big.

# File lib/packetfu/pcap.rb, line 6
        def set_endianness(e=nil)
                unless [:little, :big].include? e
                        raise ArgumentError, "Unknown endianness for #{self.class}" 
                end
                @int32 = e == :little ? Int32le : Int32be
                @int16 = e == :little ? Int16le : Int16be
                return e
        end
sz()

Normally, self.size and self.length will refer to the Struct size as an array. It’s a hassle to redefine, so this introduces some shorthand to get at the size of the resultant string.

This method is also aliased as len
# File lib/packetfu/structfu.rb, line 9
        def sz
                self.to_s.size
        end
sz()

Instead of returning the “size” of the object, which is usually the number of elements of the Struct, returns the size of the object after a to_s. Essentially, a short version of self.to_size.size

# File lib/packetfu/pcap.rb, line 18
        def sz
                self.to_s.size
        end
typecast(i)

Typecast is used mostly by packet header classes, such as IPHeader, TCPHeader, and the like. It takes an argument, and casts it to the expected type for that element.

# File lib/packetfu/structfu.rb, line 18
        def typecast(i)
                c = caller[0].match(/.*`([^']+)='/)[1]
                self[c.intern].read i
        end