Advertisement
mIs4

Untitled

Dec 4th, 2022
447
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.16 KB | None | 0 0
  1.   public static bool CompressVar(string pathSrc, string pathDest)
  2.     {
  3.  
  4.         int codeLength = 8;
  5.         BitArray bufferLSB = new BitArray(8);
  6.         BitArray bufferMSB = new BitArray(8);
  7.        
  8.         FileStream sourceFile = new FileStream("pathSrc", FileMode.Open, FileAccess.Read);
  9.         using (StreamReader sr = new StreamReader(sourceFile))
  10.         {
  11.             FileStream destFile = new FileStream("pathDest", FileMode.OpenOrCreate, FileAccess.Write);
  12.             using (BinaryWriter bw = new BinaryWriter(destFile))
  13.             {
  14.  
  15.  
  16.                 //ako su sve 1 racunacemo kao kraj duzine i prelazimo na vecu duzinu
  17.                 var pattern = new StringBuilder();
  18.                 var newPattern = new StringBuilder();
  19.                 ushort buffer = 0;
  20.                 ushort queue = 0;
  21.                 Dictionary<string, ushort> map = new Dictionary<string, ushort>(); //nov recnik
  22.                                                                                        //populacija recnika ASCII tabelom
  23.                 for (int i = 0; i < 256; i++)
  24.                 {
  25.                     map.Add(((char)i).ToString(), (ushort)i);
  26.                 }
  27.                 int bufferSpace = 16; //glavni bafer za upis
  28.                 while (!sr.EndOfStream)
  29.                 {
  30.  
  31.                     if(codeLength == 13) //da bismo ogranicili rast tablice do 12 bitova
  32.                     {
  33.                         codeLength = 8;
  34.                         map.Clear();
  35.                         for (int i = 0; i < 256; i++)
  36.                         {
  37.                             map.Add(((char)i).ToString(), (ushort)i);
  38.                         }
  39.                     }
  40.  
  41.                     int readChar = sr.Read();
  42.                     newPattern = pattern.Append(readChar); //proveravamo novi pattern
  43.                     if (map.ContainsKey(newPattern.ToString()))
  44.                     {
  45.                         pattern = newPattern;
  46.                     }
  47.                     else
  48.                     {
  49.                        
  50.                         map.Add(newPattern.ToString(), (ushort)map.Count); //kodiramo novi pattern
  51.                         ushort code = map[pattern.ToString()];
  52.                        
  53.                         int pending = 16 - (ushort)(Math.Log2((double)code)+1); //koliko je dugacak trenutni kod sa kojim radimo? mozda i moze codeLenght
  54.                         if (bufferSpace >= pending) //da li imamo prostora u baferu da smestimo taj kod
  55.                         {
  56.                             buffer = (ushort)(buffer | code); //smesti ga u donje bitove
  57.                             buffer = (ushort)(buffer << bufferSpace - pending); //pomeri levo u gornje
  58.                             bufferSpace -= pending; //smanji prostor dostupan u baferu
  59.                             if (bufferSpace == 0) //msm da nece nikad da se desi ali neka ga
  60.                             {
  61.                                 bw.Write(buffer);
  62.                                 buffer = 0;
  63.                                 bufferSpace = 16;
  64.                             }
  65.                         }
  66.                         else if (bufferSpace < pending && bufferSpace > 0) //moze da se smesti kod ali samo delimicno
  67.                         {
  68.                             int fragmentSpace = pending - bufferSpace; //odredjujemo koliki deo koda moze
  69.                             int queueSpace = codeLength - fragmentSpace; //koliki deo ne moze
  70.                             ushort mask = (ushort)(Math.Pow(2, fragmentSpace) - 1);//pravimo masku za izvlacenje ova dva dela
  71.                             queue = (ushort)(mask & code);//izvlacimo deo koji ne moze
  72.                             mask = (ushort)(~mask);//sredjujemo masku za deo koji moze
  73.                             ushort fragment = 0;
  74.                             fragment = (ushort)(mask & code);//izvlacimo deo koji moze
  75.                             fragment = (ushort)(fragment >> fragmentSpace);//pomeramo ga na zadnje bitove jer su oni dostupni u baferu
  76.                             buffer = (ushort)(buffer | fragment);//dodajemo ih u bafer
  77.                             bw.Write(buffer);//praznimo bafer u strim
  78.                             buffer = 0;
  79.                             bufferSpace = 16;
  80.                             buffer = (ushort)(buffer | queue);//dodajemo deo koji nije mogao da se smesti
  81.                             buffer = (ushort)(buffer << bufferSpace - queueSpace);//pomeramo ga na pocetak
  82.                             bufferSpace -= queueSpace;//smanjujemo prostor u baferu
  83.                         }
  84.                         else//ne bi trebalo da se desi nikad
  85.                         {
  86.                             bw.Write(buffer);
  87.                             buffer = 0;
  88.                             bufferSpace = 16;
  89.                         }
  90.  
  91.                         pattern = new StringBuilder(((char)readChar).ToString()); //resetujemo pattern
  92.  
  93.                         if (map.Count-1 == Math.Pow(2, codeLength)) //provera za produzenje koda
  94.                             codeLength++;
  95.  
  96.                     }
  97.  
  98.                 }
  99.             }
  100.  
  101.         }
  102.             return true;
  103.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement