public static byte[] Encode(byte[] bytes)
{
List<byte> result = new List<byte>();
int i = 0;
while (i < bytes.Length)
{
int j = i;
do
{
j++;
}
while (j != bytes.Length && bytes[j] == bytes[i]);
int repeatCount = j - i;
if (repeatCount >= 2)
{
int segmentCount = repeatCount / 129;
int rest = repeatCount % 129;
for (int k = 0; k < segmentCount; k++)
{
result.Add(127);
result.Add(bytes[i]);
}
result.Add((byte)(rest - 2));
result.Add(bytes[i]);
i = j;
}
else
{
while (j != bytes.Length && bytes[j] != bytes[j - 1])
j++;
int nonrepeatCount = j - i;
if (j != bytes.Length)
nonrepeatCount--;
int segmentCount = nonrepeatCount / 128;
int rest = nonrepeatCount % 128;
for (int k = 0; k < segmentCount; k++)
{
result.Add(0xFF);
for (int l = 0; l < 128; l++)
result.Add(bytes[i + k * 128 + l]);
}
result.Add((byte)(0x80 | (rest - 1)));
for (int l = 0; l < rest; l++)
result.Add(bytes[i + segmentCount * 128 + l]);
i = j;
if (j != bytes.Length)
i--;
}
}
return result.ToArray();
}