def test_from_ctype(self): ae = self.assertEqual data_le = (b"\xFF\xFF" b"\x03" b"\x01" b"\x01\x02\x03\x04" b"\x05\x06\x07\x08\x09\x0A\x0B\x0C") data_be = (b"\xFF\xFF" b"\x03" b"\x01" b"\x04\x03\x02\x01" b"\x0C\x0B\x0A\x09\x08\x07\x06\x05") value = (0x04030201 << 64) | 0x0C0B0A0908070605 value = -value value = Decimal(value) / Decimal(10**3) value_le = decimal_le.from_buffer_copy(data_le) value_le = DECIMALToDecimal.from_ctype(value_le) value_be = decimal_be.from_buffer_copy(data_be) value_be = DECIMALToDecimal.from_ctype(value_be) ae(value_le, value) ae(value_be, value)
def from_stream(cls, stream, offset=None, byte_order=LITTLE_ENDIAN): """Creates a ``Decimal`` object from a stream. :type stream: :class:`lf.dec.IStream` :param stream: A stream that contains the DECIMAL structure. :type offset: ``int`` or ``None`` :param offset: The start of the DECIMAL structure in the stream. :type byte_order: constant :param byte_order: The byte order to use (from :mod:`lf.dtypes`) :rtype: ``Decimal`` :returns: The corresponding ``Decimal`` object. """ if offset is not None: stream.seek(offset, SEEK_SET) # end if data = stream.read(16) if byte_order == LITTLE_ENDIAN: ctype_value = decimal_le.from_buffer_copy(data) else: ctype_value = decimal_be.from_buffer_copy(data) # end if value = (ctype_value.hi32 << 64) | ctype_value.lo64 if ctype_value.sign: value = -value # end if return Decimal(value) / Decimal(10**ctype_value.scale)
def test_from_ctype(self): ae = self.assertEqual data_le = b"\xFF\xFF" b"\x03" b"\x01" b"\x01\x02\x03\x04" b"\x05\x06\x07\x08\x09\x0A\x0B\x0C" data_be = b"\xFF\xFF" b"\x03" b"\x01" b"\x04\x03\x02\x01" b"\x0C\x0B\x0A\x09\x08\x07\x06\x05" value = (0x04030201 << 64) | 0x0C0B0A0908070605 value = -value value = Decimal(value) / Decimal(10 ** 3) value_le = decimal_le.from_buffer_copy(data_le) value_le = DECIMALToDecimal.from_ctype(value_le) value_be = decimal_be.from_buffer_copy(data_be) value_be = DECIMALToDecimal.from_ctype(value_be) ae(value_le, value) ae(value_be, value)