Enumerations are Unsigned Integers

Enumerations are to be encoded as four byte unsigned integers. They
were previously being sent as signed integers. This caused failures
when trying to transmit values that are extensions. Extensions contain
the value 8 hex in the first nibble of the first byte.
This commit is contained in:
Nathan Reller 2015-06-15 11:37:41 -04:00
parent 537c25ff6d
commit 1d3a8e462a

View File

@ -164,7 +164,7 @@ class Struct(Base):
class Integer(Base):
LENGTH = 4
def __init__(self, value=None, tag=Tags.DEFAULT):
def __init__(self, value=None, tag=Tags.DEFAULT, signed=True):
super(Integer, self).__init__(tag, type=Types.INTEGER)
self.value = value
@ -173,6 +173,10 @@ class Integer(Base):
self.length = self.LENGTH
self.padding_length = self.LENGTH
if signed:
self.pack_string = '!i'
else:
self.pack_string = '!I'
self.validate()
@ -181,8 +185,8 @@ class Integer(Base):
raise errors.ReadValueError(Integer.__name__, 'length',
self.LENGTH, self.length)
self.value = unpack('!i', istream.read(self.length))[0]
pad = unpack('!i', istream.read(self.padding_length))[0]
self.value = unpack(self.pack_string, istream.read(self.length))[0]
pad = unpack(self.pack_string, istream.read(self.padding_length))[0]
if pad is not 0:
raise errors.ReadValueError(Integer.__name__, 'pad', 0,
@ -194,8 +198,8 @@ class Integer(Base):
self.read_value(istream)
def write_value(self, ostream):
ostream.write(pack('!i', self.value))
ostream.write(pack('!i', 0))
ostream.write(pack(self.pack_string, self.value))
ostream.write(pack(self.pack_string, 0))
def write(self, ostream):
super(Integer, self).write(ostream)
@ -393,9 +397,9 @@ class Enumeration(Integer):
self.validate()
if self.enum is None:
super(Enumeration, self).__init__(None, tag)
super(Enumeration, self).__init__(None, tag, False)
else:
super(Enumeration, self).__init__(self.enum.value, tag)
super(Enumeration, self).__init__(self.enum.value, tag, False)
self.type = Types.ENUMERATION
def read(self, istream):