lib/bindata/int.rb in bindata-0.9.2 vs lib/bindata/int.rb in bindata-0.9.3

- old
+ new

@@ -32,35 +32,46 @@ end def self.create_read_code(nbits, endian) c16 = (endian == :little) ? 'v' : 'n' c32 = (endian == :little) ? 'V' : 'N' - b1 = (endian == :little) ? 0 : 1 - b2 = (endian == :little) ? 1 : 0 + idx = (0 ... (nbits / 32)).to_a + idx.reverse! if (endian == :little) case nbits - when 8; "io.readbytes(1).unpack('C').at(0)" - when 16; "io.readbytes(2).unpack('#{c16}').at(0)" - when 32; "io.readbytes(4).unpack('#{c32}').at(0)" - when 64; "(a = io.readbytes(8).unpack('#{c32 * 2}'); " + - "(a.at(#{b2}) << 32) + a.at(#{b1}))" + when 8; "io.readbytes(1).unpack('C').at(0)" + when 16; "io.readbytes(2).unpack('#{c16}').at(0)" + when 32; "io.readbytes(4).unpack('#{c32}').at(0)" + when 64; "(a = io.readbytes(8).unpack('#{c32 * 2}'); " + + "(a.at(#{idx[0]}) << 32) + " + + "a.at(#{idx[1]}))" + when 128; "(a = io.readbytes(16).unpack('#{c32 * 4}'); " + + "((a.at(#{idx[0]}) << 96) + " + + "(a.at(#{idx[1]}) << 64) + " + + "(a.at(#{idx[2]}) << 32) + " + + "a.at(#{idx[3]})))" else raise "unknown nbits '#{nbits}'" end end def self.create_to_s_code(nbits, endian) c16 = (endian == :little) ? 'v' : 'n' c32 = (endian == :little) ? 'V' : 'N' - v1 = (endian == :little) ? 'val' : '(val >> 32)' - v2 = (endian == :little) ? '(val >> 32)' : 'val' + vals = (0 ... (nbits / 32)).collect { |i| "(val >> #{32 * i})" } + vals.reverse! if (endian == :little) case nbits - when 8; "val.chr" - when 16; "[val].pack('#{c16}')" - when 32; "[val].pack('#{c32}')" - when 64; "[#{v1} & 0xffffffff, #{v2} & 0xffffffff].pack('#{c32 * 2}')" + when 8; "val.chr" + when 16; "[val].pack('#{c16}')" + when 32; "[val].pack('#{c32}')" + when 64; "[#{vals[1]} & 0xffffffff, " + + "#{vals[0]} & 0xffffffff].pack('#{c32 * 2}')" + when 128; "[#{vals[3]} & 0xffffffff, " + + "#{vals[2]} & 0xffffffff, " + + "#{vals[1]} & 0xffffffff, " + + "#{vals[0]} & 0xffffffff].pack('#{c32 * 4}')" else raise "unknown nbits '#{nbits}'" end end @@ -139,10 +150,22 @@ class Uint64be < BinData::Single register(self.name, self) Integer.create_uint_methods(self, 64, :big) end + # Unsigned 16 byte little endian integer. + class Uint128le < BinData::Single + register(self.name, self) + Integer.create_uint_methods(self, 128, :little) + end + + # Unsigned 16 byte big endian integer. + class Uint128be < BinData::Single + register(self.name, self) + Integer.create_uint_methods(self, 128, :big) + end + # Signed 1 byte integer. class Int8 < BinData::Single register(self.name, self) Integer.create_int_methods(self, 8, :little) end @@ -179,7 +202,19 @@ # Signed 8 byte big endian integer. class Int64be < BinData::Single register(self.name, self) Integer.create_int_methods(self, 64, :big) + end + + # Signed 16 byte little endian integer. + class Int128le < BinData::Single + register(self.name, self) + Integer.create_int_methods(self, 128, :little) + end + + # Signed 16 byte big endian integer. + class Int128be < BinData::Single + register(self.name, self) + Integer.create_int_methods(self, 128, :big) end end