示例#1
0
        /// <summary>
        /// Read the value for an unknown key as bytes.
        /// Used to preserve unknown keys during deserialization.
        /// Requires the message option preserveunknown=true.
        /// </summary>
        public static byte[] ReadValueBytes(Stream stream, Key key)
        {
            byte[] b;
            int    offset = 0;

            switch (key.WireType)
            {
            case Wire.Fixed32:
                b = new byte[4];
                while (offset < 4)
                {
                    offset += stream.Read(b, offset, 4 - offset);
                }
                return(b);

            case Wire.Fixed64:
                b = new byte[8];
                while (offset < 8)
                {
                    offset += stream.Read(b, offset, 8 - offset);
                }
                return(b);

            case Wire.LengthDelimited:
                //Read and include length in value buffer
                uint length = ProtocolParser.ReadUInt32(stream);
                using (var ms = new MemoryStream())
                {
                    //TODO: pass b directly to MemoryStream constructor or skip usage of it completely
                    ProtocolParser.WriteUInt32(ms, length);
                    b = new byte[length + ms.Length];
                    ms.ToArray().CopyTo(b, 0);
                    offset = (int)ms.Length;
                }

                //Read data into buffer
                while (offset < b.Length)
                {
                    offset += stream.Read(b, offset, b.Length - offset);
                }
                return(b);

            case Wire.Varint:
                return(ProtocolParser.ReadVarIntBytes(stream));

            default:
                throw new ProtocolBufferException("Unknown wire type: " + key.WireType);
            }
        }
示例#2
0
        public static byte[] ReadValueBytes(Stream stream, Key key)
        {
            int offset = 0;

            switch (key.WireType)
            {
            case Wire.Varint:
                return(ProtocolParser.ReadVarIntBytes(stream));

            case Wire.Fixed64:
                byte[] buffer1 = new byte[8];
                while (offset < 8)
                {
                    offset += stream.Read(buffer1, offset, 8 - offset);
                }
                return(buffer1);

            case Wire.LengthDelimited:
                uint   val = ProtocolParser.ReadUInt32(stream);
                byte[] buffer2;
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    ProtocolParser.WriteUInt32((Stream)memoryStream, val);
                    buffer2 = new byte[(long)val + memoryStream.Length];
                    memoryStream.ToArray().CopyTo((Array)buffer2, 0);
                    offset = (int)memoryStream.Length;
                }
                while (offset < buffer2.Length)
                {
                    offset += stream.Read(buffer2, offset, buffer2.Length - offset);
                }
                return(buffer2);

            case Wire.Fixed32:
                byte[] buffer3 = new byte[4];
                while (offset < 4)
                {
                    offset += stream.Read(buffer3, offset, 4 - offset);
                }
                return(buffer3);

            default:
                throw new NotImplementedException("Unknown wire type: " + (object)key.WireType);
            }
        }