public override string Encode(byte[] data)
{
int dataLength = data.Length;
StringBuilder result = new StringBuilder((dataLength + 4) / 5 * 8);
byte x1, x2;
int i;
int length5 = (dataLength / 5) * 5;
for (i = 0; i < length5; i += 5)
{
x1 = data[i];
result.Append(Alphabet[x1 >> 3]);
x2 = data[i + 1];
result.Append(Alphabet[((x1 << 2) & 0x1C) | (x2 >> 6)]);
result.Append(Alphabet[(x2 >> 1) & 0x1F]);
x1 = data[i + 2];
result.Append(Alphabet[((x2 << 4) & 0x10) | (x1 >> 4)]);
x2 = data[i + 3];
result.Append(Alphabet[((x1 << 1) & 0x1E) | (x2 >> 7)]);
result.Append(Alphabet[(x2 >> 2) & 0x1F]);
x1 = data[i + 4];
result.Append(Alphabet[((x2 << 3) & 0x18) | (x1 >> 5)]);
result.Append(Alphabet[x1 & 0x1F]);
}
switch (dataLength - length5)
{
case 1:
x1 = data[i];
result.Append(Alphabet[x1 >> 3]);
result.Append(Alphabet[(x1 << 2) & 0x1C]);
result.Append(Special, 6);
break;
case 2:
x1 = data[i];
result.Append(Alphabet[x1 >> 3]);
x2 = data[i + 1];
result.Append(Alphabet[((x1 << 2) & 0x1C) | (x2 >> 6)]);
result.Append(Alphabet[(x2 >> 1) & 0x1F]);
result.Append(Alphabet[(x2 << 4) & 0x10]);
result.Append(Special, 4);
break;
case 3:
x1 = data[i];
result.Append(Alphabet[x1 >> 3]);
x2 = data[i + 1];
result.Append(Alphabet[((x1 << 2) & 0x1C) | (x2 >> 6)]);
result.Append(Alphabet[(x2 >> 1) & 0x1F]);
x1 = data[i + 2];
result.Append(Alphabet[((x2 << 4) & 0x10) | (x1 >> 4)]);
result.Append(Alphabet[(x1 << 1) & 0x1E]);
result.Append(Special, 3);
break;
case 4:
x1 = data[i];
result.Append(Alphabet[x1 >> 3]);
x2 = data[i + 1];
result.Append(Alphabet[((x1 << 2) & 0x1C) | (x2 >> 6)]);
result.Append(Alphabet[(x2 >> 1) & 0x1F]);
x1 = data[i + 2];
result.Append(Alphabet[((x2 << 4) & 0x10) | (x1 >> 4)]);
x2 = data[i + 3];
result.Append(Alphabet[((x1 << 1) & 0x1E) | (x2 >> 7)]);
result.Append(Alphabet[(x2 >> 2) & 0x1F]);
result.Append(Alphabet[(x2 << 3) & 0x18]);
result.Append(Special);
break;
}
return result.ToString();
}