LZW
#undef debug #define debugdisplay #undef debugdictionary using System; using System.Collections;
namespace LZW { public class cLZW { #region Constrcut public cLZW() { } #endregion #region Coding public string InCharStream { set { _InCharStream = value; } get {return _InCharStream; } } public ArrayList CodingCodeStream { get {return _CodingCodeStream;} } public ArrayList CodingDictionary { get {return _CodingDictionary;} } private void InitCodingDictionary() { _CodingDictionary.Clear(); #if debug _CodingDictionary.Add("A"); _CodingDictionary.Add("B"); _CodingDictionary.Add("C"); #else for(int i = 0; i < 256; i++) { _CodingDictionary.Add((char)i); } #endif } private void AddCodingDictionary(object str) { _CodingDictionary.Add(str); } private void AddCodingCodeStream(object str) { _CodingCodeStream.Add(str); } private bool ISInCodingDictionary(string Prefix) { bool result = false; int count = _CodingDictionary.Count; for(int i = 0; i < count; i++) { string temp = _CodingDictionary[i].ToString(); if (temp.IndexOf(Prefix) >= 0) { result = true; break; } } return result; } private string GetIndexCodingDictionary(string Prefix) { string result ="0"; int count = _CodingDictionary.Count; for(int i = 0; i < count; i++) { string temp = _CodingDictionary[i].ToString(); if (temp.IndexOf(Prefix) >= 0) { result = Convert.ToString(i + 1); break; } } return result; } private void DisplayCodingCodeStream() { System.Console.WriteLine("*********_CodingCodeStream************"); for(int i = 0; i < _CodingCodeStream.Count; i++) { System.Console.WriteLine(_CodingCodeStream[i].ToString()); } } private void DisplayCodingDictionary() { System.Console.WriteLine("*********_CodingDictionary************"); for(int i = 0; i < _CodingDictionary.Count; i++) { System.Console.WriteLine(_CodingDictionary[i].ToString()); } } private void DisplayInCharStream() { System.Console.WriteLine("*********_InCharStream************"); System.Console.WriteLine(_InCharStream); } private void InitCodingCodeStream() { _CodingCodeStream.Clear(); } private ArrayList _CodingDictionary = new ArrayList(); private string _InCharStream = ""; private ArrayList _CodingCodeStream = new ArrayList(); public void Coding() { string Prefix ="" ; string c =""; string PrefixIndex= "0"; int count = _InCharStream.Length; if (count == 0) return ; InitCodingDictionary(); InitCodingCodeStream(); Prefix = _InCharStream[0].ToString(); for(int i = 1; i < count; i++) { c = _InCharStream[i].ToString(); if (ISInCodingDictionary( Prefix + c)) { Prefix += c; } else { PrefixIndex = GetIndexCodingDictionary(Prefix); AddCodingCodeStream(PrefixIndex); AddCodingDictionary( Prefix + c); Prefix = c; } } PrefixIndex = GetIndexCodingDictionary(Prefix); AddCodingCodeStream(PrefixIndex); #if debugdisplay DisplayInCharStream(); DisplayCodingCodeStream(); #if debugdictionary DisplayCodingDictionary(); #endif #endif } #endregion #region Decode private ArrayList _DeCodeDictionary = new ArrayList(); private ArrayList _OutCharStream = new ArrayList(); private int[] _DeCodeCodeStream ; public void SetDeCodeSCodetream(int[] obj) { int count = obj.Length; _DeCodeCodeStream = new int[count]; for(int i =0; i < count ; i++) { _DeCodeCodeStream[i] = obj[i]; } } public void SetDeCodeSCodetream(ArrayList obj) { int count = obj.Count; _DeCodeCodeStream = new int[count]; for(int i =0; i < count ; i++) { _DeCodeCodeStream[i] = System.Convert.ToInt32(obj[i]); } } public int[] GetDeCodeCodeStream() { return _DeCodeCodeStream; } public string OutCharStream { get { string result = ""; for(int i = 0,count = _OutCharStream.Count; i < count; i++) { result += _OutCharStream[i].ToString(); } return result; } } public ArrayList DeCodeDictionary { get { return _DeCodeDictionary; } } private void InitDeCodeDictionary() { _DeCodeDictionary.Clear(); #if debug _DeCodeDictionary.Add("A"); _DeCodeDictionary.Add("B"); _DeCodeDictionary.Add("C"); #else for(int i = 0; i < 256; i++) { _DeCodeDictionary.Add((char)i); } #endif } private void InitOutCharStream() { _OutCharStream.Clear(); } private void DisplayOutCharStream() { System.Console.WriteLine("*********_OutCharStream************"); string temp = ""; for(int i = 0; i < _OutCharStream.Count; i++) { temp = temp + (_OutCharStream[i].ToString()); } System.Console.WriteLine(temp); } private void DisplayDeCodeDictionary() { System.Console.WriteLine("*********_DeCodeDictionary************"); for(int i = 0; i < _DeCodeDictionary.Count; i++) { System.Console.WriteLine(_DeCodeDictionary[i].ToString()); } } private void DisplayDeCodeCodeStream() { System.Console.WriteLine("*********_DeCodeCodeStream************"); int count = _DeCodeCodeStream.Length; for(int i = 0; i < count; i++) { System.Console.WriteLine("{0}",_DeCodeCodeStream[i]); } } private void AddOutCharStream(object str) { _OutCharStream.Add(str); } private void AddDeCodeDictionary(object str) { _DeCodeDictionary.Add(str); } private bool ISInDeCodeDictionary(int cw) { bool result = false; int count = _DeCodeDictionary.Count; if (cw <= count - 1) { result = true; } return result; } public void Decode() { InitDeCodeDictionary(); InitOutCharStream(); int cw = 0; int pw = 0; string Prefix = ""; string c=""; cw = _DeCodeCodeStream[0] - 1; this.AddOutCharStream(this._DeCodeDictionary[cw]); pw = cw; int count = _DeCodeCodeStream.Length; if (count == 0) return; for(int i = 1; i < count; i++) { cw = _DeCodeCodeStream[i] - 1; if (ISInDeCodeDictionary(cw)) { this.AddOutCharStream(this._DeCodeDictionary[cw]); Prefix = this._DeCodeDictionary[pw].ToString(); c = (this._DeCodeDictionary[cw].ToString())[0].ToString(); this.AddDeCodeDictionary(Prefix + c); } else { Prefix = this._DeCodeDictionary[pw].ToString(); c = Prefix[0].ToString(); this.AddOutCharStream(Prefix + c); this.AddDeCodeDictionary(Prefix + c); } pw = cw; } #if debugdisplay DisplayOutCharStream(); DisplayDeCodeCodeStream(); #if debugdictionary DisplayDeCodeDictionary(); #endif #endif } #endregion } }
#undef debug using System;
namespace LZW { class Class1 { [STAThread] static void Main(string[] args) { cLZW lzw = new cLZW(); #if debug lzw.InCharStream = "ABBABABACCBBAAA"; #else System.Console.WriteLine("Enter the Tests CharArray [a-zA-Z0-9]:"); lzw.InCharStream = System.Console.ReadLine(); #endif System.Console.WriteLine("The Coding ... ..."); lzw.Coding(); System.Console.WriteLine("The DeCode ... ..."); lzw.SetDeCodeSCodetream(lzw.CodingCodeStream); lzw.Decode(); System.Console.ReadLine(); } } }
---------------------------------------------- τ 认识你会不会是一种错误 如果这是个错误 也应该是个美丽的错误 但愿这个错误能够一辈子
______________ζ浮云¢惊龙 |