convertBinaryToDecimal static method
Decimal?
convertBinaryToDecimal(
- BsonBinary binary
)
Implementation
static Decimal? convertBinaryToDecimal(BsonBinary binary) {
Int64 high, low;
binary.rewind();
low = binary.readFixInt64();
high = binary.readFixInt64();
/// The Decimal class does not support a NaN field
/// Return a null value
if ((high & naNMask) == naNMask) {
return null;
}
var isNegative = (high & signMask) == signMask;
/// The decimal class does not manage infinite value
/// return a very high values
if ((high & infinityMask) == infinityMask) {
if (isNegative) {
return -infinityValue;
}
return infinityValue;
}
var isFiniteCase2 = (high & finite2Mask) == finite2Mask;
Int32 exponent;
Decimal significand, highSignificand;
significand = Decimal.parse(low.toRadixString(10));
// Unfortunately we have only an Int64 and not an UInt64
if (low.isNegative) {
significand += maxUInt64;
}
if (isFiniteCase2) {
exponent = ((high & exponent2Mask) >> 47).toInt32();
highSignificand = Decimal.parse(
((high & significand2Mask) | significand2impliedMask)
.toRadixString(10));
} else {
exponent = ((high & exponent1Mask) >> 49).toInt32();
highSignificand =
Decimal.parse((high & significand1Mask).toRadixString(10));
}
if (exponent > maxExponent) {
return Decimal.zero;
}
exponent = (exponent - 6176) as Int32;
significand += highSignificand * maxUInt64;
if (significand > maxSignificand) {
significand = Decimal.zero;
}
if (isNegative) {
significand = -significand;
}
return significand * _d10.pow(exponent.toInt()).toDecimal();
}