예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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)