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(); } } }