コード例 #1
0
ファイル: MsgEncoder.cs プロジェクト: zj831007/knight
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        //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;
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        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;
            }
        }
コード例 #9
0
        //Encode tag.
        private byte[] encodeTag(string type, int tag)
        {
            int flag = this.util.containType(type);

            return(Encoder.encodeUInt32((uint)(tag << 3 | flag)));
        }
コード例 #10
0
 ////Encode UInt32.
 private void writeUInt32(byte [] buffer, ref int offset, object value)
 {
     offset = writeBytes(buffer, offset, Encoder.encodeUInt32(value.ToString()));
 }
コード例 #11
0
ファイル: Encoder.cs プロジェクト: midgithub/OverLord-Client
 public static byte[] encodeUInt32(string n)
 {
     return(Encoder.encodeUInt32(Convert.ToUInt32(n)));
 }
コード例 #12
0
ファイル: Encoder.cs プロジェクト: midgithub/OverLord-Client
 public static byte[] encodeSInt32(int n)
 {
     return(Encoder.encodeUInt32(n < 0 ? (uint)(Math.Abs(n) * 2 - 1) : (uint)(n * 2)));
 }
コード例 #13
0
 ////Encode UInt32.
 private void writeUInt32(byte[] buffer, ref int offset, IJsonNode value)
 {
     offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)value.AsInt()));
 }