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); }
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); }
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); }
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); }
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))); }
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); }
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); }
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); }
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); }
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); }
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; } }
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; } }
public BinaryData(IntelligentMail.BinaryData value) { this.number = (uint[])value.number.Clone(); this.numberLength = value.numberLength; }