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