/// <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); } }
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); } }