Ejemplo n.º 1
0
        /// <summary>
        /// The decode.
        /// </summary>
        /// <param name="value">
        /// The value.
        /// </param>
        /// <returns>
        /// The <see cref="Tuple"/>.
        /// </returns>
        public static Tuple <int, int> Decode(int[] value)
        {
            if (value.Length < 3)
            {
                throw new ArgumentException("Given trits can not be Pascal decoded. Invalid length.");
            }

            if (value.Take(4).SequenceEqual(Zero))
            {
                return(new Tuple <int, int>(0, 4));
            }

            var encoderStart = End(value);
            var inputEnd     = encoderStart + (encoderStart / Constants.TritsPerTryte);
            var encoder      = Converter.TritsToInt(value.Skip(encoderStart).Take(inputEnd - encoderStart).ToArray());

            var result = 0;

            for (var i = 0; i < encoderStart / Constants.TritsPerTryte; i++)
            {
                var tritsIntValue = ((encoder >> i) & 1) != 0
                              ? -Converter.TritsToInt(value.Skip(i * Constants.TritsPerTryte).Take(Constants.TritsPerTryte).ToArray())
                              : Converter.TritsToInt(value.Skip(i * Constants.TritsPerTryte).Take(Constants.TritsPerTryte).ToArray());

                result = result + ((int)Math.Pow(27, i) * tritsIntValue);
            }

            return(new Tuple <int, int>(result, inputEnd));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// The end.
        /// </summary>
        /// <param name="input">
        /// The input.
        /// </param>
        /// <returns>
        /// The <see cref="int"/>.
        /// </returns>
        private static int End(int[] input)
        {
            if (Converter.TritsToInt(input.Take(Constants.TritsPerTryte).ToArray()) > 0)
            {
                return(Constants.TritsPerTryte);
            }

            return(Constants.TritsPerTryte + End(input.Skip(Constants.TritsPerTryte).ToArray()));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// The encode.
        /// </summary>
        /// <param name="value">
        /// The value.
        /// </param>
        /// <returns>
        /// The <see cref="int[]"/>.
        /// </returns>
        public static int[] Encode(int value)
        {
            if (value == 0)
            {
                return(Zero);
            }

            var length = RoundThird(CalculateMinimumTrits(Math.Abs(value), 1));
            var trits  = new int[EncodedLength(value)];

            IntToTrits(value, trits);

            var encoding = 0;
            var index    = 0;

            for (var i = 0; i < length - Constants.TritsPerTryte; i += Constants.TritsPerTryte)
            {
                var tritValue  = trits.Skip(i).Take(Constants.TritsPerTryte).ToArray();
                var tritsAsInt = Converter.TritsToInt(tritValue);

                if (tritsAsInt >= 0)
                {
                    encoding |= 1 << index;
                    for (var j = 0; j < tritValue.Length; j++)
                    {
                        trits[i + j] = -tritValue[j];
                    }
                }

                index++;
            }

            if (Converter.TritsToInt(trits.Skip(length - Constants.TritsPerTryte).Take(length).ToArray()) < 0)
            {
                encoding |= 1 << index;
                for (var i = 0; i < trits.Skip(length - Constants.TritsPerTryte).Take(length).ToArray().Length; i++)
                {
                    trits[i + length - Constants.TritsPerTryte] = -trits[i + length - Constants.TritsPerTryte];
                }
            }

            var checksumTrits = new int[trits.Length - length];

            IntToTrits(encoding, checksumTrits);

            for (var i = 0; i < checksumTrits.Length; i++)
            {
                trits[length + i] = checksumTrits[i];
            }

            return(trits);
        }