Beispiel #1
0
        public string Decode(byte[] bs)
        {
            var sb = new StringBuilder(bs.Length * 8);

            for (int i = 0; i < bs.Length; i++)
            {
                sb.Append(Convert.ToString(bs[i], 2).PadLeft(8, '0'));
            }
            var data_str = sb.ToString();

            sb.Clear();
            var count = Convert.ToByte(data_str.Substring(0, 6), 2);
            // 正文部分解码的位置
            var cursor = count + 6;

            for (int i = 0; i < count; i++)
            {
                if (data_str[6 + i] == '1')        // huffman解码
                {
                    var t = _reDat.GetShortestPrefix(data_str, cursor, data_str.Length);
                    if (t != null)
                    {
                        cursor += t.Item1;
                        sb.Append(t.Item2);
                    }
                    else
                    {
                        throw new Exception("Huffman decode error");
                    }
                }
                else                                // 普通解码
                {
                    var us = Convert.ToUInt16(data_str.Substring(cursor, 16), 2);
                    cursor += 16;
                    var c = (char)us;
                    sb.Append(c);
                }
            }
            return(sb.ToString());
        }