public static string Unpack(byte[] packed, int start, int count)
{
if (packed[start] == 0xff)
{
return ASCIIEncoding.ASCII.GetString(packed, start + 1, count - 1);
}
int pattern = packed[start] & 0xf;
StringBuilder builder = new StringBuilder();
for (int b = start; b < count + start; )
{
int i = packed[b++] >> 4;
if (i == 0xf)
{
builder.Append((char)packed[b++]);
}
else
{
builder.Append(PATTERNS[pattern, i]);
}
if (b >= packed.Length)
{
break;
}
i = packed[b] & 0xf;
if (i == 0xf)
{
builder.Append((char)((packed[b++] & 0xf0) | (packed[b] & 0xf)));
}
else
{
builder.Append(PATTERNS[pattern, i]);
}
}
return builder.ToString();
}