lib/mikunyan/binary_reader.rb in mikunyan-3.9.0 vs lib/mikunyan/binary_reader.rb in mikunyan-3.9.1
- old
+ new
@@ -1,115 +1,149 @@
require 'bin_utils'
module Mikunyan
+ # Class for manipulating binary string
+ # @attr [Symbol] endian endianness
+ # @attr [Integer] pos position
+ # @attr [Integer] length data size
class BinaryReader
attr_accessor :endian, :pos, :length
+ # Constructor
+ # @param [String] data binary string
+ # @param [Symbol] endian endianness
def initialize(data, endian = :big)
@data = data
@pos = 0
@length = data.bytesize
@endian = endian
end
+ # Returns whether little endian or not
+ # @return [Boolean]
def little?
@endian == :little
end
- def jmp(pos = 0)
+ # Jump to given position
+ # @param [Integer] pos position
+ def jmp(pos=0)
@pos = pos
end
- def adv(size = 0)
+ # Advance position given size
+ # @param [Integer] size size
+ def adv(size=0)
@pos += size
end
+ # Round up position to multiple of given size
+ # @param [Integer] size size
def align(size)
@pos = (@pos + size - 1) / size * size
end
+ # Read given size of binary string and seek
+ # @param [Integer] size size
+ # @return [String] data
def read(size)
data = @data.byteslice(@pos, size)
@pos += size
data
end
+ # Read string until null character
+ # @return [String] string
def cstr
r = @data.unpack("@#{pos}Z*")[0]
@pos += r.bytesize + 1
r
end
+ # Read 8bit signed integer
def i8
i8s
end
+ # Read 8bit signed integer
def i8s
r = BinUtils.get_sint8(@data, @pos)
@pos += 1
r
end
+ # Read 8bit unsigned integer
def i8u
r = BinUtils.get_int8(@data, @pos)
@pos += 1
r
end
+ # Read 16bit signed integer
def i16
i16s
end
+ # Read 16bit signed integer
def i16s
r = little? ? BinUtils.get_sint16_le(@data, @pos) : BinUtils.get_sint16_be(@data, @pos)
@pos += 2
r
end
+ # Read 16bit unsigned integer
def i16u
r = little? ? BinUtils.get_int16_le(@data, @pos) : BinUtils.get_int16_be(@data, @pos)
@pos += 2
r
end
+ # Read 32bit signed integer
def i32
i32s
end
+ # Read 32bit signed integer
def i32s
r = little? ? BinUtils.get_sint32_le(@data, @pos) : BinUtils.get_sint32_be(@data, @pos)
@pos += 4
r
end
+ # Read 32bit unsigned integer
def i32u
r = little? ? BinUtils.get_int32_le(@data, @pos) : BinUtils.get_int32_be(@data, @pos)
@pos += 4
r
end
+ # Read 64bit signed integer
def i64
i64s
end
+ # Read 64bit signed integer
def i64s
r = little? ? BinUtils.get_sint64_le(@data, @pos) : BinUtils.get_sint64_be(@data, @pos)
@pos += 8
r
end
+ # Read 64bit unsigned integer
def i64u
r = little? ? BinUtils.get_int64_le(@data, @pos) : BinUtils.get_int64_be(@data, @pos)
@pos += 8
r
end
+ # Read 32bit floating point value
def float
r = little? ? @data.byteslice(@pos, 4).unpack('e')[0] : @data.byteslice(@pos, 4).unpack('g')[0]
@pos += 4
r
end
+ # Read 64bit floating point value
def double
r = little? ? @data.byteslice(@pos, 8).unpack('E')[0] : @data.byteslice(@pos, 8).unpack('G')[0]
@pos += 8
r
end