/// <summary> /// Encode the message from server. /// </summary> /// <param name='route'> /// Route. /// </param> /// <param name='msg'> /// Message. /// </param> public byte [] encode(string route, JSONNode msg) { byte [] returnByte = null; object proto; if (this.protos.TryGetValue(route, out proto)) { if (!checkMsg(msg, (JSONNode)proto)) { return(null); } int length = Encoder.byteLength(msg.ToString()) * 2; int offset = 0; byte [] buff = new byte[length]; offset = encodeMsg(buff, offset, (JSONNode)proto, msg); returnByte = new byte[offset]; for (int i = 0; i < offset; i++) { returnByte[i] = buff[i]; } } return(returnByte); }
/// <summary> /// Encode each item in message. /// </summary> private int encodeProp(object value, string type, int offset, byte [] buffer, JsonObject proto) { switch (type) { case "uInt32": this.writeUInt32(buffer, ref offset, value); break; case "int32": case "sInt32": this.writeSInt32(buffer, ref offset, value); break; case "float": this.writeFloat(buffer, ref offset, value); break; case "double": this.writeDouble(buffer, ref offset, value); break; case "string": this.writeString(buffer, ref offset, value); break; default: object __messages; object __message_type; if (proto.TryGetValue("__messages", out __messages)) { if (((JsonObject)__messages).TryGetValue(type, out __message_type) || protos.TryGetValue("message " + type, out __message_type)) { byte [] tembuff = new byte[Encoder.byteLength(value.ToString()) * 3]; int length = 0; length = this.encodeMsg(tembuff, length, (JsonObject)__message_type, (JsonObject)value); offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)length)); for (int i = 0; i < length; i++) { buffer[offset] = tembuff[i]; offset++; } } } break; } return(offset); }
private int encodeProp(object value, string type, int offset, byte[] buffer, JsonObject proto) { switch (type) { case "uInt32": this.writeUInt32(buffer, ref offset, value); break; case "int32": case "sInt32": this.writeInt32(buffer, ref offset, value); break; case "float": this.writeFloat(buffer, ref offset, value); break; case "double": this.writeDouble(buffer, ref offset, value); break; case "string": this.writeString(buffer, ref offset, value); break; default: object obj1; object obj2; if (proto.TryGetValue("__messages", out obj1) && (((JsonObject)obj1).TryGetValue(type, out obj2) || this.protos.TryGetValue("message " + type, out obj2))) { byte[] buffer1 = new byte[Encoder.byteLength(value.ToString()) * 3]; int offset1 = 0; int num = this.encodeMsg(buffer1, offset1, (JsonObject)obj2, (JsonObject)value); offset = this.writeBytes(buffer, offset, Encoder.encodeUInt32((uint)num)); for (int index = 0; index < num; ++index) { buffer[offset] = buffer1[index]; ++offset; } break; } break; } return(offset); }
/// <summary> /// Encode the array type. /// </summary> private int encodeArray(List <object> msg, JObject protoField, int offset, byte[] buffer) { var type = protoField["type"]; var id = protoField["id"]; if (type != null && id != null) { if (util.isSimpleType(type.ToString())) { // 简单类型,packed 编码 int length = Encoder.byteLength(msg.ToString()) * 2; int subOffset = 0; byte[] subBuff = new byte[length]; offset = writeBytes(buffer, offset, encodeTag("repeated", Convert.ToInt32(id))); foreach (object item in msg) { subOffset = encodeProp(item, type.ToString(), subOffset, subBuff, true); } offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)subOffset)); for (var i = 0; i < subOffset; i++) { buffer[offset + i] = subBuff[i]; } offset += subOffset; } else { foreach (object item in msg) { int length = Encoder.byteLength(msg.ToString()) * 2; int subOffset = 0; byte[] subBuff = new byte[length]; offset = writeBytes(buffer, offset, encodeTag("repeated", Convert.ToInt32(id))); subOffset = encodeProp(item, type.ToString(), subOffset, subBuff, true); offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)subOffset)); for (var i = 0; i < subOffset; i++) { buffer[offset + i] = subBuff[i]; } offset += subOffset; } } } return(offset); }
/// <summary> /// Encode the message from server. /// </summary> /// <param name='route'> /// Route. /// </param> /// <param name='msg'> /// Message. /// </param> public byte[] encode(string route, JObject msg) { byte[] returnByte = null; JObject proto = util.GetProtoMessage(protos, route); if (proto != null) { int length = Encoder.byteLength(msg.ToString()) * 2; int offset = 0; byte[] buff = new byte[length]; offset = encodeMsg(buff, offset, proto, msg); returnByte = new byte[offset]; for (int i = 0; i < offset; i++) { returnByte[i] = buff[i]; } } return(returnByte); }
private void encodeObject(string type, JObject msg, ref int offset, byte[] buffer, bool inArray) { JObject subProto = util.GetProtoMessage(protos, type); if (subProto != null) { byte[] subBuff = new byte[Encoder.byteLength(msg.ToString())]; int subOffset = 0; subOffset = encodeMsg(subBuff, subOffset, subProto, msg); if (!inArray) { // 不在数组里,则需要记录长度 offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)subOffset)); } for (int i = 0; i < subOffset; i++) { buffer[offset + i] = subBuff[i]; } offset += subOffset; } }
public byte[] encode(string route, JsonObject msg) { byte[] numArray = (byte[])null; object obj; if (this.protos.TryGetValue(route, out obj)) { if (!this.checkMsg(msg, (JsonObject)obj)) { return((byte[])null); } int length1 = Encoder.byteLength(msg.ToString()) * 2; int offset = 0; byte[] buffer = new byte[length1]; int length2 = this.encodeMsg(buffer, offset, (JsonObject)obj, msg); numArray = new byte[length2]; for (int index = 0; index < length2; ++index) { numArray[index] = buffer[index]; } } return(numArray); }