Пример #1
0
        public static bool UnpackString(ReadBuffer rb, ref string value)
        {
            byte t = rb.MoveNext();

            if (t == 0xc0)
            {
                value = null;
                return(true);
            }
            if (t > 0x9f && t < 0xc0)
            {
                int slen = t & 0x1f;
                if (rb.Left() < slen)
                {
                    Console.WriteLine("UnpackString fixed str failed");
                    return(false);
                }
                value = rb.CopyString(slen);
                rb.MoveOffset(slen);
                return(true);
            }
            switch (t)
            {
            case 0xd9:    // str8
            {
                if (rb.Left() < 1)
                {
                    Console.WriteLine("UnpackString str8 length failed");
                    return(false);
                }
                byte slen = rb.MoveNext();
                if (rb.Left() < slen)
                {
                    Console.WriteLine("UnpackString str8 failed");
                    return(false);
                }
                value = rb.CopyString(slen);
                rb.MoveOffset(slen);
                break;
            }

            case 0xda:    // str16
            {
                ushort slen = 0;
                if (rb.Left() < 2)
                {
                    Console.WriteLine("UnpackString str16 length failed");
                    return(false);
                }
                ReadNumber(rb.Data(), rb.Offset(), ref slen);
                rb.MoveOffset(2);
                if (rb.Left() < slen)
                {
                    Console.WriteLine("UnpackString str16 failed");
                    return(false);
                }
                value = rb.CopyString(slen);
                rb.MoveOffset(slen);
                break;
            }

            case 0xdb:    // str32
            {
                uint slen = 0;
                if (rb.Left() < 4)
                {
                    Console.WriteLine("UnpackString str32 length failed");
                    return(false);
                }
                ReadNumber(rb.Data(), rb.Offset(), ref slen);
                rb.MoveOffset(4);
                if (rb.Left() < slen)
                {
                    Console.WriteLine("UnpackString str32 failed");
                    return(false);
                }
                value = rb.CopyString((int)slen);
                rb.MoveOffset((int)slen);
                break;
            }

            default:
            {
                Console.WriteLine("UnpackString unknown type " + t.ToString());
                return(false);
            }
            }
            return(true);
        }