code: def _read_decimal(data, size, writer_schema):
      
      scale = writer_schema.get('scale', 0)
      precision = writer_schema['precision']
  
      datum_byte = str2ints(data)
  
      unscaled_datum = 0
      msb = fstint(data)
      leftmost_bit = (msb >> 7) & 1
      if leftmost_bit == 1:
          modified_first_byte = datum_byte[0] ^ (1 << 7)
          datum_byte = [modified_first_byte] + datum_byte[1:]
          for offset in xrange(size):
              unscaled_datum <<= 8
              unscaled_datum += datum_byte[offset]
          unscaled_datum += pow(-2, (size * 8) - 1)
      else:
          for offset in xrange(size):
              unscaled_datum <<= 8
              unscaled_datum += (datum_byte[offset])
  
      with localcontext() as ctx:
          ctx.prec = precision
          scaled_datum = Decimal(unscaled_datum).scaleb(-scale)
      return scaled_datum
docs: based on https://github.com/apache/avro/pull/82/