コード例 #1
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
        private IntelligentMail.BinaryData BuildBinaryData(string value)
        {
            string s   = value.Substring(20);
            string str = value.Substring(0, 20);

            IntelligentMail.BinaryData binaryData1;
            switch (s.Length)
            {
            case 0:
                binaryData1 = new IntelligentMail.BinaryData();
                break;

            case 5:
                binaryData1 = new IntelligentMail.BinaryData(long.Parse(s) + 1L);
                break;

            case 9:
                binaryData1 = new IntelligentMail.BinaryData(long.Parse(s) + 100000L + 1L);
                break;

            case 11:
                binaryData1 = new IntelligentMail.BinaryData(long.Parse(s) + 1000000000L + 100000L + 1L);
                break;

            default:
                throw new ArgumentException("The provided routing code is not of the correct length. Allowed lengths are 0, 5, 9, 11.");
            }
            IntelligentMail.BinaryData binaryData2 = (binaryData1 * new IntelligentMail.BinaryData(10L) + new IntelligentMail.BinaryData((long)int.Parse(str.Substring(0, 1)))) * new IntelligentMail.BinaryData(5L) + new IntelligentMail.BinaryData((long)int.Parse(str.Substring(1, 1)));
            for (int startIndex = 2; startIndex < str.Length; ++startIndex)
            {
                binaryData2 = binaryData2 * new IntelligentMail.BinaryData(10L) + new IntelligentMail.BinaryData((long)int.Parse(str.Substring(startIndex, 1)));
            }
            return(binaryData2);
        }
コード例 #2
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            public static IntelligentMail.BinaryData operator -(
                IntelligentMail.BinaryData operand)
            {
                if (operand.numberLength == 1 && operand.number[0] == 0U)
                {
                    return(new IntelligentMail.BinaryData());
                }
                IntelligentMail.BinaryData binaryData = new IntelligentMail.BinaryData(operand);
                for (int index = 0; index < 4; ++index)
                {
                    binaryData.number[index] = ~operand.number[index];
                }
                long num1 = 1;

                for (int index = 0; num1 != 0L && index < 4; ++index)
                {
                    long num2 = (long)binaryData.number[index] + 1L;
                    binaryData.number[index] = (uint)((ulong)num2 & (ulong)uint.MaxValue);
                    num1 = num2 >> 32;
                }
                binaryData.numberLength = 4;
                while (binaryData.numberLength > 1 && binaryData.number[binaryData.numberLength - 1] == 0U)
                {
                    --binaryData.numberLength;
                }
                return(binaryData);
            }
コード例 #3
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
 public static IntelligentMail.BinaryData operator <<(
     IntelligentMail.BinaryData bi1,
     int shiftVal)
 {
     IntelligentMail.BinaryData binaryData = new IntelligentMail.BinaryData(bi1);
     binaryData.numberLength = IntelligentMail.BinaryData.ShiftLeft(binaryData.number, shiftVal);
     return(binaryData);
 }
コード例 #4
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            public static IntelligentMail.BinaryData operator *(
                IntelligentMail.BinaryData left,
                IntelligentMail.BinaryData right)
            {
                int  index1 = 3;
                bool flag1  = false;
                bool flag2  = false;

                if (((int)left.number[index1] & int.MinValue) != 0)
                {
                    flag1 = true;
                    left  = -left;
                }
                if (((int)right.number[index1] & int.MinValue) != 0)
                {
                    flag2 = true;
                    right = -right;
                }
                IntelligentMail.BinaryData binaryData = new IntelligentMail.BinaryData();
                for (int index2 = 0; index2 < left.numberLength; ++index2)
                {
                    if (left.number[index2] != 0U)
                    {
                        ulong num1   = 0;
                        int   index3 = 0;
                        int   index4 = index2;
                        while (index3 < right.numberLength)
                        {
                            ulong num2 = (ulong)left.number[index2] * (ulong)right.number[index3] + (ulong)binaryData.number[index4] + num1;
                            binaryData.number[index4] = (uint)(num2 & (ulong)uint.MaxValue);
                            num1 = num2 >> 32;
                            ++index3;
                            ++index4;
                        }
                        if (num1 != 0UL)
                        {
                            binaryData.number[index2 + right.numberLength] = (uint)num1;
                        }
                    }
                }
                binaryData.numberLength = left.numberLength + right.numberLength;
                if (binaryData.numberLength > 4)
                {
                    binaryData.numberLength = 4;
                }
                while (binaryData.numberLength > 1 && binaryData.number[binaryData.numberLength - 1] == 0U)
                {
                    --binaryData.numberLength;
                }
                if (flag1 != flag2)
                {
                    return(-binaryData);
                }
                return(binaryData);
            }
コード例 #5
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
        protected override string GetEncoding(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return(string.Empty);
            }
            IntelligentMail.BinaryData binaryData = this.BuildBinaryData(value);
            int fnc = this.GenerateFnc(binaryData);

            int[] codewords = this.ConvertBinaryDataToCodewords(binaryData);
            this.AddAdditionalInformationToCodewords(codewords, fnc);
            return(this.ConvertCharactersToIntelligentMailLetterSequence(this.ConvertCodewordsToCharacters(codewords, fnc)));
        }
コード例 #6
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
 private int[] ConvertBinaryDataToCodewords(IntelligentMail.BinaryData binaryData)
 {
     int[] numArray = new int[10];
     IntelligentMail.BinaryData binaryData1 = new IntelligentMail.BinaryData(636L);
     IntelligentMail.BinaryData binaryData2 = new IntelligentMail.BinaryData(1365L);
     numArray[9] = (int)(binaryData % binaryData1);
     binaryData /= binaryData1;
     for (int index = 8; index >= 1; --index)
     {
         numArray[index] = (int)(binaryData % binaryData2);
         binaryData     /= binaryData2;
     }
     numArray[0] = (int)binaryData;
     return(numArray);
 }
コード例 #7
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            public static IntelligentMail.BinaryData operator +(
                IntelligentMail.BinaryData left,
                IntelligentMail.BinaryData right)
            {
                IntelligentMail.BinaryData binaryData = new IntelligentMail.BinaryData();
                binaryData.numberLength = Math.Max(left.numberLength, right.numberLength);
                long num1 = 0;

                for (int index = 0; index < binaryData.numberLength; ++index)
                {
                    long num2 = (long)left.number[index] + (long)right.number[index] + num1;
                    num1 = num2 >> 32;
                    binaryData.number[index] = (uint)((ulong)num2 & (ulong)uint.MaxValue);
                }
                if (num1 != 0L && binaryData.numberLength < 4)
                {
                    binaryData.number[binaryData.numberLength] = (uint)num1;
                    ++binaryData.numberLength;
                }
                return(binaryData);
            }
コード例 #8
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            public static IntelligentMail.BinaryData operator /(
                IntelligentMail.BinaryData left,
                IntelligentMail.BinaryData right)
            {
                IntelligentMail.BinaryData outQuotient  = new IntelligentMail.BinaryData();
                IntelligentMail.BinaryData outRemainder = new IntelligentMail.BinaryData();
                int  index = 3;
                bool flag1 = false;
                bool flag2 = false;

                if (((int)left.number[index] & int.MinValue) != 0)
                {
                    left  = -left;
                    flag1 = true;
                }
                if (((int)right.number[index] & int.MinValue) != 0)
                {
                    right = -right;
                    flag2 = true;
                }
                if (left < right)
                {
                    return(outQuotient);
                }
                if (right.numberLength == 1)
                {
                    IntelligentMail.BinaryData.SingleByteDivide(left, right, outQuotient, outRemainder);
                }
                else
                {
                    IntelligentMail.BinaryData.MultiByteDivide(left, right, outQuotient, outRemainder);
                }
                if (flag1 != flag2)
                {
                    return(-outQuotient);
                }
                return(outQuotient);
            }
コード例 #9
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
        private int GenerateFnc(IntelligentMail.BinaryData binaryData)
        {
            byte[] byteArray = binaryData.ToByteArray(13);
            int    num1      = 3893;
            int    num2      = 2047;
            int    num3      = (int)byteArray[0] << 5;

            for (int index = 2; index < 8; ++index)
            {
                num2   = (((num2 ^ num3) & 1024) == 0 ? num2 << 1 : num2 << 1 ^ num1) & 2047;
                num3 <<= 1;
            }
            for (int index1 = 1; index1 < 13; ++index1)
            {
                int num4 = (int)byteArray[index1] << 3;
                for (int index2 = 0; index2 < 8; ++index2)
                {
                    num2   = (((num2 ^ num4) & 1024) == 0 ? num2 << 1 : num2 << 1 ^ num1) & 2047;
                    num4 <<= 1;
                }
            }
            return(num2);
        }
コード例 #10
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            public static IntelligentMail.BinaryData operator -(
                IntelligentMail.BinaryData left,
                IntelligentMail.BinaryData right)
            {
                IntelligentMail.BinaryData binaryData = new IntelligentMail.BinaryData();
                binaryData.numberLength = Math.Max(left.numberLength, right.numberLength);
                long num1 = 0;

                for (int index = 0; index < binaryData.numberLength; ++index)
                {
                    long num2 = (long)left.number[index] - (long)right.number[index] - num1;
                    binaryData.number[index] = (uint)((ulong)num2 & (ulong)uint.MaxValue);
                    num1 = num2 >= 0L ? 0L : 1L;
                }
                if (num1 != 0L)
                {
                    for (int numberLength = binaryData.numberLength; numberLength < 4; ++numberLength)
                    {
                        binaryData.number[numberLength] = uint.MaxValue;
                    }
                    binaryData.numberLength = 4;
                }
                return(binaryData);
            }
コード例 #11
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            private static void MultiByteDivide(
                IntelligentMail.BinaryData left,
                IntelligentMail.BinaryData right,
                IntelligentMail.BinaryData outQuotient,
                IntelligentMail.BinaryData outRemainder)
            {
                uint[] numArray1 = new uint[4];
                int    length1   = left.numberLength + 1;

                uint[] number = new uint[length1];
                uint   num1   = 2147483648;
                uint   num2   = right.number[right.numberLength - 1];
                int    numberOfPositionsToShift = 0;
                int    num3 = 0;

                for (; num1 != 0U && ((int)num2 & (int)num1) == 0; num1 >>= 1)
                {
                    ++numberOfPositionsToShift;
                }
                for (int index = 0; index < left.numberLength; ++index)
                {
                    number[index] = left.number[index];
                }
                IntelligentMail.BinaryData.ShiftLeft(number, numberOfPositionsToShift);
                right <<= numberOfPositionsToShift;
                int   num4    = length1 - right.numberLength;
                int   index1  = length1 - 1;
                ulong num5    = (ulong)right.number[right.numberLength - 1];
                ulong num6    = (ulong)right.number[right.numberLength - 2];
                int   length2 = right.numberLength + 1;

                uint[] numArray2 = new uint[length2];
                for (; num4 > 0; --num4)
                {
                    ulong num7 = ((ulong)number[index1] << 32) + (ulong)number[index1 - 1];
                    ulong num8 = num7 / num5;
                    ulong num9 = num7 % num5;
                    bool  flag = false;
                    while (!flag)
                    {
                        flag = true;
                        if (num8 == 4294967296UL || num8 * num6 > (num9 << 32) + (ulong)number[index1 - 2])
                        {
                            --num8;
                            num9 += num5;
                            if (num9 < 4294967296UL)
                            {
                                flag = false;
                            }
                        }
                    }
                    for (int index2 = 0; index2 < length2; ++index2)
                    {
                        numArray2[index2] = number[index1 - index2];
                    }
                    IntelligentMail.BinaryData binaryData1 = new IntelligentMail.BinaryData(numArray2);
                    IntelligentMail.BinaryData binaryData2 = right * new IntelligentMail.BinaryData((long)num8);
                    while (binaryData2 > binaryData1)
                    {
                        --num8;
                        binaryData2 -= right;
                    }
                    IntelligentMail.BinaryData binaryData3 = binaryData1 - binaryData2;
                    for (int index2 = 0; index2 < length2; ++index2)
                    {
                        number[index1 - index2] = binaryData3.number[right.numberLength - index2];
                    }
                    numArray1[num3++] = (uint)num8;
                    --index1;
                }
                outQuotient.numberLength = num3;
                int index3 = 0;
                int index4 = outQuotient.numberLength - 1;

                while (index4 >= 0)
                {
                    outQuotient.number[index3] = numArray1[index4];
                    --index4;
                    ++index3;
                }
                for (; index3 < 4; ++index3)
                {
                    outQuotient.number[index3] = 0U;
                }
                while (outQuotient.numberLength > 1 && outQuotient.number[outQuotient.numberLength - 1] == 0U)
                {
                    --outQuotient.numberLength;
                }
                if (outQuotient.numberLength == 0)
                {
                    outQuotient.numberLength = 1;
                }
                outRemainder.numberLength = IntelligentMail.BinaryData.ShiftRight(number, numberOfPositionsToShift);
                int index5;

                for (index5 = 0; index5 < outRemainder.numberLength; ++index5)
                {
                    outRemainder.number[index5] = number[index5];
                }
                for (; index5 < 4; ++index5)
                {
                    outRemainder.number[index5] = 0U;
                }
            }
コード例 #12
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
            private static void SingleByteDivide(
                IntelligentMail.BinaryData left,
                IntelligentMail.BinaryData right,
                IntelligentMail.BinaryData outQuotient,
                IntelligentMail.BinaryData outRemainder)
            {
                uint[] numArray = new uint[4];
                int    num1     = 0;

                for (int index = 0; index < 4; ++index)
                {
                    outRemainder.number[index] = left.number[index];
                }
                outRemainder.numberLength = left.numberLength;
                while (outRemainder.numberLength > 1 && outRemainder.number[outRemainder.numberLength - 1] == 0U)
                {
                    --outRemainder.numberLength;
                }
                ulong num2   = (ulong)right.number[0];
                int   index1 = outRemainder.numberLength - 1;
                ulong num3   = (ulong)outRemainder.number[index1];

                if (num3 >= num2)
                {
                    ulong num4 = num3 / num2;
                    numArray[num1++]            = (uint)num4;
                    outRemainder.number[index1] = (uint)(num3 % num2);
                }
                ulong num5;

                for (int index2 = index1 - 1; index2 >= 0; outRemainder.number[index2--] = (uint)(num5 % num2))
                {
                    num5 = ((ulong)outRemainder.number[index2 + 1] << 32) + (ulong)outRemainder.number[index2];
                    ulong num4 = num5 / num2;
                    numArray[num1++] = (uint)num4;
                    outRemainder.number[index2 + 1] = 0U;
                }
                outQuotient.numberLength = num1;
                int index3 = 0;
                int index4 = outQuotient.numberLength - 1;

                while (index4 >= 0)
                {
                    outQuotient.number[index3] = numArray[index4];
                    --index4;
                    ++index3;
                }
                for (; index3 < 4; ++index3)
                {
                    outQuotient.number[index3] = 0U;
                }
                while (outQuotient.numberLength > 1 && outQuotient.number[outQuotient.numberLength - 1] == 0U)
                {
                    --outQuotient.numberLength;
                }
                if (outQuotient.numberLength == 0)
                {
                    outQuotient.numberLength = 1;
                }
                while (outRemainder.numberLength > 1 && outRemainder.number[outRemainder.numberLength - 1] == 0U)
                {
                    --outRemainder.numberLength;
                }
            }
コード例 #13
0
ファイル: IntelligentMail.cs プロジェクト: RichardHaggard/BDC
 public BinaryData(IntelligentMail.BinaryData value)
 {
     this.number       = (uint[])value.number.Clone();
     this.numberLength = value.numberLength;
 }