/// <summary> /// Encode the array type. /// </summary> private int encodeArray(JsonArray msg, JsonNode value, int offset, byte[] buffer, JsonNode proto) { JsonNode value_type = null, value_tag = null; if (value.TryGetValue("type", out value_type) && value.TryGetValue("tag", out value_tag)) { if (this.util.isSimpleType(value_type.AsString)) { offset = this.writeBytes(buffer, offset, this.encodeTag(value_type.AsString, value_tag.AsInt)); offset = this.writeBytes(buffer, offset, Encoder.encodeUInt32((uint)msg.Count)); for (int i = 0; i < msg.Count; i++) { offset = this.encodeProp(msg[i], value_type.AsString, offset, buffer, null); } } else { for (int i = 0; i < msg.Count; i++) { offset = this.writeBytes(buffer, offset, this.encodeTag(value_type.AsString, value_tag.AsInt)); offset = this.encodeProp(msg[i], value_type.AsString, offset, buffer, proto); } } } return(offset); }
/// <summary> /// Encode the array type. /// </summary> private int encodeArray(List <object> msg, JsonObject value, int offset, byte[] buffer, JsonObject proto) { object value_type, value_tag; if (value.TryGetValue("type", out value_type) && value.TryGetValue("tag", out value_tag)) { if (this.util.isSimpleType(value_type.ToString())) { offset = this.writeBytes(buffer, offset, this.encodeTag(value_type.ToString(), Convert.ToInt32(value_tag))); offset = this.writeBytes(buffer, offset, Encoder.encodeUInt32((uint)msg.Count)); foreach (object item in msg) { offset = this.encodeProp(item, value_type.ToString(), offset, buffer, null); } } else { foreach (object item in msg) { offset = this.writeBytes(buffer, offset, this.encodeTag(value_type.ToString(), Convert.ToInt32(value_tag))); offset = this.encodeProp(item, value_type.ToString(), offset, buffer, proto); } } } return(offset); }
/// <summary> /// Encode the array type. /// </summary> private int encodeArray(JsonData msg, JsonData value, int offset, byte[] buffer, JsonData proto) { object value_type, value_tag; if (value.TryGetValue("type", out value_type) && value.TryGetValue("tag", out value_tag)) { if (this.util.isSimpleType(value_type.ToString())) { offset = this.writeBytes(buffer, offset, this.encodeTag(value_type.ToString(), Convert.ToInt32(value_tag.ToString()))); offset = this.writeBytes(buffer, offset, Encoder.encodeUInt32((uint)msg.Count)); //foreach (object item in msg) for (int i = 0; i < msg.Count; ++i) { offset = this.encodeProp(msg[i], value_type.ToString(), offset, buffer, null); } } else { //foreach (object item in msg) for (int i = 0; i < msg.Count; ++i) { byte[] bytes = this.encodeTag(value_type.ToString(), Convert.ToInt32(value_tag.ToString())); offset = this.writeBytes(buffer, offset, bytes); offset = this.encodeProp(msg[i], value_type.ToString(), offset, buffer, proto); } } } return(offset); }
//Encode string. private void writeString(byte [] buffer, ref int offset, object value) { int le = Encoding.UTF8.GetByteCount(value.ToString()); offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)le)); byte[] bytes = Encoding.UTF8.GetBytes(value.ToString()); this.writeBytes(buffer, offset, bytes); offset += le; }
/// <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); }
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; } }
//Encode tag. private byte[] encodeTag(string type, int tag) { int flag = this.util.containType(type); return(Encoder.encodeUInt32((uint)(tag << 3 | flag))); }
////Encode UInt32. private void writeUInt32(byte [] buffer, ref int offset, object value) { offset = writeBytes(buffer, offset, Encoder.encodeUInt32(value.ToString())); }
public static byte[] encodeUInt32(string n) { return(Encoder.encodeUInt32(Convert.ToUInt32(n))); }
public static byte[] encodeSInt32(int n) { return(Encoder.encodeUInt32(n < 0 ? (uint)(Math.Abs(n) * 2 - 1) : (uint)(n * 2))); }
////Encode UInt32. private void writeUInt32(byte[] buffer, ref int offset, IJsonNode value) { offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)value.AsInt())); }