2013-06-25 3 views
0

Я закончил алгоритм сжатия/декомпрессии Хаффмана. Я использую строку для проверки ввода, например «foo bar» 7x8 = 56 дает мне 10010110111011100 = 17 + - 35% от первоначального размера сжимается обратно.Сохранить сжатый файл/строку huffman

Но теперь я хочу сохранить его как файл, может ли кто-нибудь объяснить мне подход, как это сделать.

При необходимости я могу опубликовать источник моего заявления.

Моя форма просто CODE (Также есть класс cNode для прогулок по дереву)

class cZU 
{ 

    private List<cNode> cNodes = new List<cNode>(); 
    public cNode Root { get; set; } 
    public Dictionary<char, int> Frequencies = new Dictionary<char, int>(); 

    public void mWalktree(string source) 
    { 

     for (int i = 0; i < source.Length; i++) 
     { 

      if (!Frequencies.ContainsKey(source[i])) 
      { 
       Frequencies.Add(source[i], 0); 
      } 

      Frequencies[source[i]]++; 
     } 

     foreach (KeyValuePair<char, int> symbol in Frequencies) 
     { 
      cNodes.Add(new cNode() { Symbol = symbol.Key, Frequency = symbol.Value }); 
     } 

     while (cNodes.Count > 1) 
     { 
      List<cNode> orderedcNodes = cNodes.OrderBy(cNode => cNode.Frequency).ToList<cNode>(); 

      if (orderedcNodes.Count >= 2) 
      { 
       // Take first two items 
       List<cNode> taken = orderedcNodes.Take(2).ToList<cNode>(); 

       // Create a parent cNode by combining the frequencies 
       cNode parent = new cNode() 
       { 

        Symbol = '*', 
        Frequency = taken[0].Frequency + taken[1].Frequency, 
        Left = taken[0], 
        Right = taken[1] 
       }; 

       cNodes.Remove(taken[0]); 
       cNodes.Remove(taken[1]); 
       cNodes.Add(parent); 
      } 

      this.Root = cNodes.FirstOrDefault(); 
     } 
    } 

    public BitArray Encode(string source) 
    { 
     List<bool> encodedSource = new List<bool>(); 

     for (int i = 0; i < source.Length; i++) 
     { 
      List<bool> encodedSymbol = this.Root.Traverse(source[i], new List<bool>()); 
      encodedSource.AddRange(encodedSymbol); 
     } 

     BitArray bits = new BitArray(encodedSource.ToArray()); 

     return bits; 
    } 

Сейчас я просто делаю это нравится:

string = "foo bar"; 
ZU.mWalktree(inputstring); 

И только вывод кодированный строковый пользователь, но мне нужно сохранить закодированный файл в .txt, и мой вопрос заключается в том, что мне нужно сохранить в этом .txt-файле, чтобы позже декодировать файл.

Надеюсь, что это очистит.

ответ

0

Вам может понадобиться Base64 кодер (потери сжатия), чтобы сделать его предварительный просмотр, возможность в текстовом редакторе, чтобы сохранить его, то вам нужно только вывести его в файл

System.IO.File.WriteAllText(@"C:\Users\Public\TestFolder\WriteText.txt", str_your_base64_encoded_bit_array); 

или непосредственно (как это сжатый файл):

BitArray bit_array = . . . . 
byte [] bytes = new byte[bit_array.Length/8 + (bit_array.Length % 8 == 0 ? 0 : 1)]; 
bit_array.CopyTo(bytes, 0); 
File.WriteAllBytes(@"C:\MyFile.bin", bytes); 
+0

Да, это именно то, что мне нужно, большое спасибо за помощь! – user2519968