Files
2026-06-04 11:42:34 +02:00

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;
}
}