public void Load(ZipData zip) { var code = new BoolList(); var info = new InfoSource(); this.path = zip.path; for (int i = 0; i < zip.data.Length; i++) { code.Add(zip.data[i]); if (zip.Codes.ContainsKey(code)) { // 一部分複合する.瞬時符号って最高 info.AddRange(zip.Codes[code]); code.Clear(); } } this.byteArray = new byte[zip.byteNumber]; var temp = info.ToByteArray(); for (int i = 0; i < this.byteArray.Length; i++) { byteArray[i] = temp[i]; } /* * for(int i = 0 ; i < byteArray.Length ; i++ ) * { * byte b = 0x00; * for(int j = 0 ; j < 8 ; j++ ){ * b <<= 1; * b |= info[ i * 8 + j ] ? (byte)0x01 : (byte)0x00; * } * byteArray[i] = b; * }*/ }
public void Load(BinaryData bdata) { // byte[]をkeyにすると全てユニークとして判定された var dict = new Dictionary <InfoSource, int>(); this.path = bdata.path; for (int i = 0; i < bdata.GetNum(n_byte); i++) { var element = new InfoSource(bdata.GetAt(i, n_byte)); if (dict.ContainsKey(element)) { dict[element]++; } else { dict.Add(element, 1); } } var list = new List <Node>(); // キーを列挙 foreach (var k in dict.Keys) { var node = new Node(); node.Value = dict[k]; node.element = k; node.isLeaf = true; list.Add(node); } while (list.Count >= 2) { // 小さい順 // あとでpriority_queueに直す(直さないと思う) list.Sort((a, b) => a.Value - b.Value); //Console.WriteLine(list[0].Value); //Console.WriteLine(list[1].Value); // 小さい順に取り出す var node1 = list[0]; list.RemoveAt(0); var node2 = list[0]; list.RemoveAt(0); // くっつける var node3 = new Node(); node3.Value = node1.Value + node2.Value; node3.Left = node1; node3.Right = node2; // 加える list.Add(node3); } //Console.WriteLine(list[0].Value); // code,element this.Codes = new Dictionary <BoolList, InfoSource>(); this.InvertedCodes = new Dictionary <InfoSource, BoolList>(); // 割当 AssignCode(list[0], new BoolList()); // なんか表示するやつ //foreach (var k in Codes.Keys) // Console.WriteLine(Codes[k] +"\t" + dict[Codes[k]] +"\t" + k ); // 総バイト数は保存しないと byteNumber = bdata.byteNumber; // エントロピーのでっかい情報源を作る data = new BoolList(); for (int i = 0; i < bdata.GetNum(n_byte); i++) { var element = new InfoSource(bdata.GetAt(i, n_byte)); data.AddRange(InvertedCodes[element]); } // なんか表示するやつ //Console.WriteLine(data); }