183 lines
7.7 KiB
C#
183 lines
7.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace FATrace.App.UniCodeToZPL
|
|
{
|
|
/// <summary>
|
|
/// 编码压缩处理
|
|
/// </summary>
|
|
internal class ZebraCompress
|
|
{
|
|
/// <summary>
|
|
/// 编码处理压缩算法
|
|
/// </summary>
|
|
/// <param name="code">需要压缩的16进制编码</param>
|
|
/// <returns>
|
|
/// 返回压缩完的算法
|
|
/// </returns>
|
|
public static string ZebraCompressCode(string code)
|
|
{
|
|
List<CompressCodeInfo> list = new List<CompressCodeInfo>();
|
|
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();
|
|
}
|
|
}
|
|
}
|