コード例 #1
0
        public static BufferSegment ReadBytes(MsgPackStream stream)
        {
            var code = stream.ReadUInt8();

            switch (code)
            {
            case FormatCode.Bin8: return(stream.ReadBytes(stream.ReadUInt8()));

            case FormatCode.Bin16: return(stream.ReadBytes(stream.ReadUInt16()));

            case FormatCode.Bin32: return(stream.ReadBytes(stream.ReadUInt32()));

            case FormatCode.Nil: return(new BufferSegment());

            default: throw new MsgPackCodeException(code);
            }
        }
コード例 #2
0
        public static BufferSegment ReadUtf8(MsgPackStream stream)
        {
            var code = stream.ReadUInt8();

            if (FormatMask.Match(code) == FormatMask.FixString)
            {
                return(stream.ReadBytes(code & 0x1Fu));
            }

            switch (code)
            {
            case FormatCode.Str8: return(stream.ReadBytes(stream.ReadUInt8()));

            case FormatCode.Str16: return(stream.ReadBytes(stream.ReadUInt16()));

            case FormatCode.Str32: return(stream.ReadBytes(stream.ReadUInt32()));

            case FormatCode.Nil: return(new BufferSegment());

            default: throw new MsgPackCodeException(code);
            }
        }
コード例 #3
0
        public void TestBytes()
        {
            var stream = new MsgPackStream();
            var bytes  = new BufferSegment(new byte[] { 1, 12, 23, 34, 45, 56 });

            stream.WriteBytes(bytes);
            Assert.AreEqual(stream.Position, bytes.Length);

            stream.Position = 0;

            Assert.True(
                BufferSegment.EqualityComparer.Equals(
                    bytes,
                    stream.ReadBytes(unchecked ((uint)bytes.Length))
                    )
                );
        }
コード例 #4
0
        public object Read(MsgPackStream stream, IContext context)
        {
            if (StreamReader.TryReadNil(stream))
            {
                return(null);
            }

            var code = stream.Peek();

            switch (StreamReader.GetType(stream))
            {
            case FormatType.Boolean:
                return(context.ResolveFormatter <bool>().Read(stream, context));

            case FormatType.Integer:
                return(FormatCode.IsSignedInteger(code)
                        ? (object)context.ResolveFormatter <long>().Read(stream, context)
                        : context.ResolveFormatter <ulong>().Read(stream, context));

            case FormatType.Float:
                return(code == FormatCode.Float32
                        ? (object)context.ResolveFormatter <float>().Read(stream, context)
                        : context.ResolveFormatter <double>().Read(stream, context));

            case FormatType.String:
                return(context.ResolveFormatter <string>().Read(stream, context));

            case FormatType.Binary:
                return(context.ResolveFormatter <byte[]>().Read(stream, context));

            case FormatType.Array:
                var count = StreamReader.ReadArrayHeader(stream);
                var array = new object[count];
                for (var i = 0; i < count; ++i)
                {
                    array[i] = Read(stream, context);
                }
                return(array);

            case FormatType.Map:
                var size = (int)StreamReader.ReadMapHeader(stream);
                var map  = new Dictionary <object, object>(size);
                for (var i = 0; i < size; ++i)
                {
                    var key   = Read(stream, context);
                    var value = Read(stream, context);
                    map[key] = value;
                }
                return(map);

            case FormatType.Extension:
                var header = StreamReader.ReadExtensionHeader(stream);
                if (header.TypeCode == DateTimeFormatter.TypeCode)
                {
                    return(DateTimeFormatter.Unpack(stream, header.Length));
                }

                return(stream.ReadBytes(header.Length).ToArray());

            default:
                throw new MsgPackException("Unsupported type code {0}", code);
            }
        }