/// <summary>
        /// Serializes the provided <paramref name="value"/>
        /// </summary>
        /// <param name="value">The value to be serialized</param>
        /// <returns>
        /// An array of bytes with length 8.
        /// </returns>
        /// <exception cref="MicrosoftDataEncryptionException">
        /// <paramref name="value"/> is out of range.
        /// </exception>
        public override byte[] Serialize(double value)
        {
            if (double.IsInfinity(value) || double.IsNaN(value))
            {
                throw new MicrosoftDataEncryptionException(ValueOutOfRange.Format(value));
            }

            return(GetBytes(value));
        }
        /// <summary>
        /// Serializes the provided <paramref name="value"/>
        /// </summary>
        /// <param name="value">The value to be serialized</param>
        /// <returns>
        /// An array of bytes with length 8.
        /// </returns>
        /// <exception cref="MicrosoftDataEncryptionException">
        /// <paramref name="value"/> is out of range.
        /// </exception>
        public override byte[] Serialize(decimal value)
        {
            if (value < MinValue || value > MaxValue)
            {
                throw new MicrosoftDataEncryptionException(ValueOutOfRange.Format(value));
            }

            return(sqlMoneySerializer.Serialize(value));
        }
        /// <summary>
        /// Serializes the provided <paramref name="value"/>
        /// </summary>
        /// <param name="value">The value to be serialized</param>
        /// <returns>
        /// An array of bytes with length 8.
        /// </returns>
        /// <exception cref="MicrosoftDataEncryptionException">
        /// <paramref name="value"/> is out of range.
        /// </exception>
        public override byte[] Serialize(DateTime value)
        {
            if (value < MinValue)
            {
                throw new MicrosoftDataEncryptionException(ValueOutOfRange.Format(value));
            }

            SqlDateTime sqlDateTime = new SqlDateTime(value);

            byte[] dayTicks  = GetBytes(sqlDateTime.DayTicks);
            byte[] timeTicks = GetBytes(sqlDateTime.TimeTicks);
            return(dayTicks.Concat(timeTicks).ToArray());
        }
Пример #4
0
        /// <summary>
        /// Serializes the provided <paramref name="value"/>
        /// </summary>
        /// <param name="value">The value to be serialized</param>
        /// <returns>
        /// An array of bytes with length 4.
        /// </returns>
        /// <exception cref="MicrosoftDataEncryptionException">
        /// <paramref name="value"/> is out of range.
        /// </exception>
        public override byte[] Serialize(DateTime value)
        {
            if (value < MinValue || value > MaxValue)
            {
                throw new MicrosoftDataEncryptionException(ValueOutOfRange.Format(value));
            }

            SqlDateTime sqlDateTime = new SqlDateTime(value.AddSeconds(30));

            byte[] dayTicks  = GetBytes((short)sqlDateTime.DayTicks);
            byte[] timeTicks = GetBytes((short)(sqlDateTime.TimeTicks / SqlDateTime.SQLTicksPerMinute));
            return(dayTicks.Concat(timeTicks).ToArray());
        }
        /// <summary>
        /// Serializes the provided <paramref name="value"/>
        /// </summary>
        /// <param name="value">The value to be serialized</param>
        /// <returns>
        /// An array of bytes with length 8.
        /// </returns>
        /// <exception cref="MicrosoftDataEncryptionException">
        /// <paramref name="value"/> is out of range.
        /// </exception>
        public override byte[] Serialize(decimal value)
        {
            if (value < MinValue || value > MaxValue)
            {
                throw new MicrosoftDataEncryptionException(ValueOutOfRange.Format(value));
            }

            value = Normalize(value);
            int sign = value > -1 ? 1 : -1;

            int[] decimalBits     = decimal.GetBits(value);
            long  longValue       = ((long)decimalBits[1] << 32) + (uint)decimalBits[0];
            long  signedLongValue = longValue * sign;
            int   low             = (int)(signedLongValue >> 32);
            int   mid             = (int)signedLongValue;

            byte[] lowbytes = GetBytes(low);
            byte[] midBytes = GetBytes(mid);

            return(lowbytes.Concat(midBytes).ToArray());
        }