using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FATrace.App.UniCodeToZPL
{
///
/// 编码压缩处理
///
internal class ZebraCompress
{
///
/// 编码处理压缩算法
///
/// 需要压缩的16进制编码
///
/// 返回压缩完的算法
///
public static string ZebraCompressCode(string code)
{
List list = new List();
char flag = '.';
int charCount = 0;
for (int i = 0; i < code.Length; i++)
{
char item = code[i];
if (item != flag)
{
if (charCount > 0)
{
list.Add(new CompressCodeInfo(flag.ToString(), charCount));
}
charCount = 0;
flag = item;
}
charCount += 1;
if (i == code.Length - 1)
{
if (charCount > 0)
{
list.Add(new CompressCodeInfo(flag.ToString(), charCount));
}
}
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < list.Count; i++)
{
CompressCodeInfo item = list[i];
if (item.Count == 0)
{
continue;
}
if (item.Count == 1)
{
builder.Append(item.Code);
continue;
}
if (item.Count <= 20)
{
builder.AppendFormat("{0}{1}", ((CompressCode)item.Count).ToString(), item.Code);
continue;
}
int count = 0;
while (true)
{
if (item.Count - count <= 0)
{
break;
}
if (item.Count - count < 20)
{
builder.AppendFormat("{0}{1}", ((CompressCode)(item.Count - count)).ToString(), item.Code);
break;
}
if ((item.Count - count) >= (int)CompressCode.z)
{
count += (int)CompressCode.z;
builder.AppendFormat("{0}{1}", (CompressCode.z).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.y)
{
count += (int)CompressCode.y;
builder.AppendFormat("{0}{1}", (CompressCode.y).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.x)
{
count += (int)CompressCode.x;
builder.AppendFormat("{0}{1}", (CompressCode.x).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.w)
{
count += (int)CompressCode.w;
builder.AppendFormat("{0}{1}", (CompressCode.w).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.v)
{
count += (int)CompressCode.v;
builder.AppendFormat("{0}{1}", (CompressCode.v).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.u)
{
count += (int)CompressCode.u;
builder.AppendFormat("{0}{1}", (CompressCode.u).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.t)
{
count += (int)CompressCode.t;
builder.AppendFormat("{0}{1}", (CompressCode.t).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.s)
{
count += (int)CompressCode.s;
builder.AppendFormat("{0}{1}", (CompressCode.s).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.r)
{
count += (int)CompressCode.r;
builder.AppendFormat("{0}{1}", (CompressCode.r).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.q)
{
count += (int)CompressCode.q;
builder.AppendFormat("{0}{1}", (CompressCode.q).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.p)
{
count += (int)CompressCode.p;
builder.AppendFormat("{0}{1}", (CompressCode.p).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.o)
{
count += (int)CompressCode.o;
builder.AppendFormat("{0}{1}", (CompressCode.o).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.n)
{
count += (int)CompressCode.n;
builder.AppendFormat("{0}{1}", (CompressCode.n).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.m)
{
count += (int)CompressCode.m;
builder.AppendFormat("{0}{1}", (CompressCode.m).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.l)
{
count += (int)CompressCode.l;
builder.AppendFormat("{0}{1}", (CompressCode.l).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.k)
{
count += (int)CompressCode.k;
builder.AppendFormat("{0}{1}", (CompressCode.k).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.j)
{
count += (int)CompressCode.j;
builder.AppendFormat("{0}{1}", (CompressCode.j).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.i)
{
count += (int)CompressCode.i;
builder.AppendFormat("{0}{1}", (CompressCode.i).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.h)
{
count += (int)CompressCode.h;
builder.AppendFormat("{0}{1}", (CompressCode.h).ToString(), item.Code);
}
else if ((item.Count - count) >= (int)CompressCode.g)
{
count += (int)CompressCode.g;
builder.AppendFormat("{0}{1}", (CompressCode.g).ToString(), item.Code);
}
}
}
return builder.ToString();
}
}
}