Пример #1
0
    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;
         * }*/
    }
Пример #2
0
    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);
    }