202 lines
4.8 KiB
C#
202 lines
4.8 KiB
C#
using System;
|
|
using System.Text;
|
|
|
|
namespace System.Globalization
|
|
{
|
|
// Token: 0x0200018B RID: 395
|
|
internal class Bootstring
|
|
{
|
|
// Token: 0x060013B2 RID: 5042 RVA: 0x0004C8C0 File Offset: 0x0004AAC0
|
|
public Bootstring(char delimiter, int baseNum, int tmin, int tmax, int skew, int damp, int initialBias, int initialN)
|
|
{
|
|
this.delimiter = delimiter;
|
|
this.base_num = baseNum;
|
|
this.tmin = tmin;
|
|
this.tmax = tmax;
|
|
this.skew = skew;
|
|
this.damp = damp;
|
|
this.initial_bias = initialBias;
|
|
this.initial_n = initialN;
|
|
}
|
|
|
|
// Token: 0x060013B3 RID: 5043 RVA: 0x0004C910 File Offset: 0x0004AB10
|
|
public string Encode(string s, int offset)
|
|
{
|
|
int num = this.initial_n;
|
|
int num2 = 0;
|
|
int num3 = this.initial_bias;
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
for (int i = 0; i < s.Length; i++)
|
|
{
|
|
if (s[i] < '\u0080')
|
|
{
|
|
stringBuilder.Append(s[i]);
|
|
}
|
|
}
|
|
int length;
|
|
int j = (length = stringBuilder.Length);
|
|
if (length > 0)
|
|
{
|
|
stringBuilder.Append(this.delimiter);
|
|
}
|
|
while (j < s.Length)
|
|
{
|
|
int num4 = int.MaxValue;
|
|
for (int k = 0; k < s.Length; k++)
|
|
{
|
|
if ((int)s[k] >= num && (int)s[k] < num4)
|
|
{
|
|
num4 = (int)s[k];
|
|
}
|
|
}
|
|
checked
|
|
{
|
|
num2 += (num4 - num) * (j + 1);
|
|
num = num4;
|
|
foreach (char c in s)
|
|
{
|
|
if ((int)c < num || c < '\u0080')
|
|
{
|
|
num2++;
|
|
}
|
|
unchecked
|
|
{
|
|
if ((int)c == num)
|
|
{
|
|
int num5 = num2;
|
|
int num6 = this.base_num;
|
|
for (;;)
|
|
{
|
|
int num7 = ((num6 > num3 + this.tmin) ? ((num6 < num3 + this.tmax) ? (num6 - num3) : this.tmax) : this.tmin);
|
|
if (num5 < num7)
|
|
{
|
|
break;
|
|
}
|
|
stringBuilder.Append(this.EncodeDigit(num7 + (num5 - num7) % (this.base_num - num7)));
|
|
num5 = (num5 - num7) / (this.base_num - num7);
|
|
num6 += this.base_num;
|
|
}
|
|
stringBuilder.Append(this.EncodeDigit(num5));
|
|
num3 = this.Adapt(num2, j + 1, j == length);
|
|
num2 = 0;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
num2++;
|
|
num++;
|
|
}
|
|
return stringBuilder.ToString();
|
|
}
|
|
|
|
// Token: 0x060013B4 RID: 5044 RVA: 0x0004CB18 File Offset: 0x0004AD18
|
|
private char EncodeDigit(int d)
|
|
{
|
|
return (char)((d >= 26) ? (d - 26 + 48) : (d + 97));
|
|
}
|
|
|
|
// Token: 0x060013B5 RID: 5045 RVA: 0x0004CB34 File Offset: 0x0004AD34
|
|
private int DecodeDigit(char c)
|
|
{
|
|
return (c - '0' >= '\n') ? ((c - 'A' >= '\u001a') ? ((c - 'a' >= '\u001a') ? this.base_num : ((int)(c - 'a'))) : ((int)(c - 'A'))) : ((int)(c - '\u0016'));
|
|
}
|
|
|
|
// Token: 0x060013B6 RID: 5046 RVA: 0x0004CB84 File Offset: 0x0004AD84
|
|
private int Adapt(int delta, int numPoints, bool firstTime)
|
|
{
|
|
if (firstTime)
|
|
{
|
|
delta /= this.damp;
|
|
}
|
|
else
|
|
{
|
|
delta /= 2;
|
|
}
|
|
delta += delta / numPoints;
|
|
int num = 0;
|
|
while (delta > (this.base_num - this.tmin) * this.tmax / 2)
|
|
{
|
|
delta /= this.base_num - this.tmin;
|
|
num += this.base_num;
|
|
}
|
|
return num + (this.base_num - this.tmin + 1) * delta / (delta + this.skew);
|
|
}
|
|
|
|
// Token: 0x060013B7 RID: 5047 RVA: 0x0004CC0C File Offset: 0x0004AE0C
|
|
public string Decode(string s, int offset)
|
|
{
|
|
int num = this.initial_n;
|
|
int num2 = 0;
|
|
int num3 = this.initial_bias;
|
|
int num4 = 0;
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
for (int i = 0; i < s.Length; i++)
|
|
{
|
|
if (s[i] == this.delimiter)
|
|
{
|
|
num4 = i;
|
|
}
|
|
}
|
|
if (num4 < 0)
|
|
{
|
|
return s;
|
|
}
|
|
stringBuilder.Append(s, 0, num4);
|
|
int j = ((num4 <= 0) ? 0 : (num4 + 1));
|
|
while (j < s.Length)
|
|
{
|
|
int num5 = num2;
|
|
int num6 = 1;
|
|
int num7 = this.base_num;
|
|
for (;;)
|
|
{
|
|
int num8 = this.DecodeDigit(s[j++]);
|
|
num2 += num8 * num6;
|
|
int num9 = ((num7 > num3 + this.tmin) ? ((num7 < num3 + this.tmax) ? (num7 - num3) : this.tmax) : this.tmin);
|
|
if (num8 < num9)
|
|
{
|
|
break;
|
|
}
|
|
num6 *= this.base_num - num9;
|
|
num7 += this.base_num;
|
|
}
|
|
num3 = this.Adapt(num2 - num5, stringBuilder.Length + 1, num5 == 0);
|
|
num += num2 / (stringBuilder.Length + 1);
|
|
num2 %= stringBuilder.Length + 1;
|
|
if (num < 128)
|
|
{
|
|
throw new ArgumentException(string.Format("Invalid Bootstring decode result, at {0}", offset + j));
|
|
}
|
|
stringBuilder.Insert(num2, (char)num);
|
|
num2++;
|
|
}
|
|
return stringBuilder.ToString();
|
|
}
|
|
|
|
// Token: 0x04000574 RID: 1396
|
|
private readonly char delimiter;
|
|
|
|
// Token: 0x04000575 RID: 1397
|
|
private readonly int base_num;
|
|
|
|
// Token: 0x04000576 RID: 1398
|
|
private readonly int tmin;
|
|
|
|
// Token: 0x04000577 RID: 1399
|
|
private readonly int tmax;
|
|
|
|
// Token: 0x04000578 RID: 1400
|
|
private readonly int skew;
|
|
|
|
// Token: 0x04000579 RID: 1401
|
|
private readonly int damp;
|
|
|
|
// Token: 0x0400057A RID: 1402
|
|
private readonly int initial_bias;
|
|
|
|
// Token: 0x0400057B RID: 1403
|
|
private readonly int initial_n;
|
|
}
|
|
}
|