module StructFu
StructFu
, a nifty way to leverage Ruby’s built in Struct
class to create meaningful binary data.
Public Instance Methods
Source
# 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
Used like typecast(), but specifically for casting Strings to StructFu::Strings.
Source
# 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
Handle deep copies correctly. Marshal in 1.9, re-read myself on 1.8
Source
# File lib/packetfu/pcap.rb, line 7 def set_endianness(e=nil) unless [:little, :big].include? e raise ArgumentError, "Unknown endianness for #{self.class}" end @int64 = e == :little ? Int64le : Int64be @int32 = e == :little ? Int32le : Int32be @int16 = e == :little ? Int16le : Int16be return e end
Set the endianness for the various Int
classes. Takes either :little or :big.
Source
# File lib/packetfu/pcap.rb, line 20 def sz self.to_s.size end
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
Also aliased as: len
Source
# File lib/packetfu/structfu.rb, line 18 def typecast(i) c = caller[0].match(/.*`([^']+)='/)[1] self[c.to_sym].read i end
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.