예제 #1
0
 private static bool CheckLeaveStatus(TreeNodeStruct NodeStruct)        //判断是否返回上级目录
 {
     if (MapCount[MapCount.Count - 1] > 0 && MapKey == true & NodeStruct.CurrentNode.Text.Contains("Map"))
     {
         MapKey = false;
         MapCount[MapCount.Count - 1] = MapCount[MapCount.Count - 1] - 1;
         if (MapCount[MapCount.Count - 1] == 0)
         {
             MapCount.RemoveAt(MapCount.Count - 1);
             return(true);
         }
     }
     else if (MapCount[MapCount.Count - 1] > 0 && MapKey == false & NodeStruct.CurrentNode.Text.Contains("Map"))
     {
         MapKey = true;
     }
     else if (ListCount[ListCount.Count - 1] > 0 && NodeStruct.CurrentNode.Text.Contains("STRUCT_BEGIN") == false && NodeStruct.CurrentNode.Text.Contains("STRUCT_END") == false & NodeStruct.CurrentNode.Text.Contains("(List)"))
     {
         ListCount[ListCount.Count - 1] = ListCount[ListCount.Count - 1] - 1;
         if (ListCount[ListCount.Count - 1] == 0)
         {
             if (ListCount.Count > 1)
             {
                 ListCount.RemoveAt(ListCount.Count - 1);
             }
             return(true);
         }
     }
     return(false);
 }
예제 #2
0
        public static TreeNodeStruct QuickDecodeProto(byte[] bytesIn, string RootKey, TreeNodeStruct NodeStruct)
        {
            var NodeList = new List <TreeNode>();

            if (!string.IsNullOrEmpty(RootKey))
            {
                NodeList.Add(NodeStruct.parentNode);
                var        NodeCollection = NodeStruct.parentNode.Nodes;
                TreeNode[] Nodes          = NodeCollection.Find(RootKey, true);
                if (Nodes.Count() > 0)
                {
                    NodeStruct.parentNode = Nodes[0];
                }
            }

            ProtoReader reader = null;

            using (var ms = new MemoryStream(bytesIn))
            {
                reader = ProtoReader.Create(ms, null, null);
            }
            long start = reader.Position;
            int  field = reader.ReadFieldHeader();

            try
            {
                while (field > 0)
                {
                    long payloadStart = reader.Position;
                    switch (reader.WireType)
                    {
                    case WireType.Varint:
                    {
                        var val = reader.ReadInt64();
                        var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (Varint) " + "Value=" + val.ToString() + " Hex=" + BitConverter.ToString(BitConverter.GetBytes(val).Reverse().ToArray()).Replace("-", " ").Replace("00 00 00", "").Trim().TrimStart('0');
                        NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                        break;
                    }

                    case WireType.Fixed32:
                    {
                        var val = reader.ReadInt32();
                        var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (Fixed32) " + "Value=" + val.ToString() + " Hex=" + BitConverter.ToString(BitConverter.GetBytes(val).Reverse().ToArray()).Replace("-", " ").Replace("00 00 00", "").Trim().TrimStart('0');
                        NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                        break;
                    }

                    case WireType.Fixed64:
                    {
                        var val = reader.ReadInt64();
                        var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (Fixed32) " + "Value=" + val.ToString() + " Hex=" + BitConverter.ToString(BitConverter.GetBytes(val).Reverse().ToArray()).Replace("-", " ").Replace("00 00 00", "").Trim().TrimStart('0');
                        NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                        break;
                    }

                    case WireType.String:
                    {
                        var payloadBytes = ProtoReader.AppendBytes(null, reader);
                        using (var subReader = ReadProto(payloadBytes))
                        {
                            if (subReader != null)
                            {
                                var RandKey = (new Random()).Next().ToString();
                                var key     = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (String-SubProto) " + "Length=" + payloadBytes.Length.ToString();
                                NodeStruct.parentNode.Nodes.Add(key + RandKey, key);
                                QuickDecodeProto(payloadBytes, key + RandKey, NodeStruct);
                            }
                            else
                            {
                                var str = Encoding.UTF8.GetString(payloadBytes).Replace("\0", "").Replace("\n", "").Replace("\r\n", "").Replace("\r", "").Replace("\b", "").Replace("\f", "").Replace("\v", "");
                                var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (String) " + "Length=" + payloadBytes.Length.ToString() + " UTF8 =" + ((payloadBytes.Length == 0) ? "\"\"" : str);
                                NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                            }
                        }
                        break;
                    }

                    case WireType.None:
                    {
                        var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (None) " + "Value=0";
                        NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                        break;
                    }

                    case WireType.StartGroup:
                    {
                        var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (StartGroup) " + "Value=StartGroup";
                        NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                        break;
                    }

                    case WireType.EndGroup:
                    {
                        var key = "Field #" + reader.FieldNumber.ToString() + " [" + bytesIn[start].ToString("x2").ToUpper() + "] (EndGroup) " + "Value=EndGroup";
                        NodeStruct.parentNode.Nodes.Add(new TreeNode(key));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                    }
                    start = reader.Position;
                    field = reader.ReadFieldHeader();
                }
            }
            catch (Exception ex)
            {
                bytesIn = bytesIn.Skip(1).ToArray();
                QuickDecodeProto(bytesIn, "", NodeStruct);
            }
            return(NodeStruct);
        }
예제 #3
0
        public static TreeNodeStruct QuickDecodeJce(string RootKey, TreeNodeStruct NodeStruct)
        {
            var NodeList = new List <TreeNode>();

            if (!string.IsNullOrEmpty(RootKey))
            {
                NodeList.Add(NodeStruct.CurrentNode);
                var        NodeCollection = NodeStruct.CurrentNode.Nodes;
                TreeNode[] Nodes          = NodeCollection.Find(RootKey, true);
                if (Nodes.Count() > 0)
                {
                    NodeStruct.CurrentNode = Nodes[0];
                }
            }

            ///////////貌似得缓存一下,不然有些分叉出现错位现象,这个对大型数据解析的速度影响很大,慢了很多,不知道该怎么处理
            ///Thread.Sleep(20);
            var now = DateTime.Now;

            while (DateTime.Now < now.AddMilliseconds(15))
            {
            }
            ///////////


            string subNode = null;

            byte[]         jceData  = null;
            HeadDataStruct HeadData = new HeadDataStruct();

            try
            {
                while (NodeStruct.BytesIn.Length > 0)
                {
                    var len = readHead(NodeStruct.BytesIn, ref HeadData);
                    var Hex = NodeStruct.BytesIn[0].ToString("x2").ToUpper();
                    NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(len).ToArray();
                    var typ = HeadData.typ;
                    var tag = HeadData.tag;
                    switch ((int)typ)
                    {
                    case (int)JceType.TYPE_BYTE:
                    {
                        jceData            = NodeStruct.BytesIn.Take(1).ToArray();
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(1).ToArray();
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Byte) Value=" + jceData[0].ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", " ");
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_SHORT:
                    {
                        jceData            = NodeStruct.BytesIn.Take(2).ToArray();
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(2).ToArray();
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Short) Value=" + BitConverter.ToInt16(jceData.Reverse().ToArray(), 0).ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", " ");
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_INT:
                    {
                        jceData            = NodeStruct.BytesIn.Take(4).ToArray();
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(4).ToArray();
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Int) Value=" + BitConverter.ToInt32(jceData.Reverse().ToArray(), 0).ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", " ");
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_LONG:
                    {
                        jceData            = NodeStruct.BytesIn.Take(8).ToArray();
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(8).ToArray();
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Long) Value=" + BitConverter.ToInt64(jceData.Reverse().ToArray(), 0).ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", " ");
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_FLOAT:
                    {
                        jceData            = NodeStruct.BytesIn.Take(4).ToArray();
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(4).ToArray();
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Single) Value=" + BitConverter.ToSingle(jceData.Reverse().ToArray(), 0).ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", " ");
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_DOUBLE:
                    {
                        jceData            = NodeStruct.BytesIn.Take(8).ToArray();
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(8).ToArray();
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Double) Value=" + BitConverter.ToDouble(jceData.Reverse().ToArray(), 0).ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", " ");
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_STRING1:
                    {
                        var jceDatalen = int.Parse(Convert.ToString(NodeStruct.BytesIn.Take(1).ToArray()[0]));
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(1).ToArray();
                        if (jceDatalen > 0)
                        {
                            if (NodeStruct.BytesIn.Length < jceDatalen)
                            {
                                jceDatalen = NodeStruct.BytesIn.Length;
                            }
                            jceData            = NodeStruct.BytesIn.Take(jceDatalen).ToArray();
                            NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(jceDatalen).ToArray();
                            var str = Encoding.UTF8.GetString(jceData).Replace("\0", "").Replace("\n", "").Replace("\r\n", "").Replace("\r", "").Replace("\b", "").Replace("\f", "").Replace("\v", "");
                            subNode = "Field #" + tag.ToString() + " [" + Hex + "] (String) Length=" + str.Length.ToString() + " UTF8=" + str;
                        }
                        else
                        {
                            subNode = "Field #" + tag.ToString() + " [" + Hex + "] (LongString) Length=0 Hex=00";
                        }
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_STRING4:
                    {
                        var jceDatalen = BitConverter.ToInt32(NodeStruct.BytesIn.Take(4).Reverse().ToArray(), 0);
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(4).ToArray();
                        if (jceDatalen > 0)
                        {
                            if (NodeStruct.BytesIn.Length < jceDatalen)
                            {
                                jceDatalen = NodeStruct.BytesIn.Length;
                            }
                            jceData            = NodeStruct.BytesIn.Take(jceDatalen).ToArray();
                            NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(jceDatalen).ToArray();
                            var str = Encoding.UTF8.GetString(jceData).Replace("\0", "").Replace("\n", "").Replace("\r\n", "").Replace("\r", "").Replace("\b", "").Replace("\f", "").Replace("\v", "");
                            subNode = "Field #" + tag.ToString() + " [" + Hex + "] (LongString) Length=" + str.Length.ToString() + " UTF8=" + str;
                        }
                        else
                        {
                            subNode = "Field #" + tag.ToString() + " [" + Hex + "] (LongString) Length=0 Hex=00";
                        }
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_MAP:
                    {
                        var            count = 0;
                        HeadDataStruct HD    = new HeadDataStruct();
                        NodeStruct.BytesIn = SkipLength(NodeStruct.BytesIn, ref count, ref HD);
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (Map) Count=" + count.ToString();
                        if (count > 0)
                        {
                            MapCount.Add(count);
                            MapKey = false;
                            var RandKey = new Random().Next().ToString();
                            NodeStruct.CurrentNode.Nodes.Add(subNode + RandKey, subNode);
                            NodeStruct = QuickDecodeJce(subNode + RandKey, NodeStruct);
                        }
                        else
                        {
                            NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        }
                        break;
                    }

                    case (int)JceType.TYPE_LIST:
                    {
                        var            count = 0;
                        HeadDataStruct HD    = new HeadDataStruct();
                        NodeStruct.BytesIn = SkipLength(NodeStruct.BytesIn, ref count, ref HD);
                        subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (List) Count=" + count.ToString();
                        if (count > 0)
                        {
                            ListCount.Add(count);
                            var RandKey = new Random().Next().ToString();
                            NodeStruct.CurrentNode.Nodes.Add(subNode + RandKey, subNode);
                            NodeStruct = QuickDecodeJce(subNode + RandKey, NodeStruct);
                        }
                        else
                        {
                            NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        }
                        break;
                    }

                    case (int)JceType.TYPE_STRUCT_BEGIN:
                    {
                        if (tag.ToString() != "0")
                        {
                            subNode = "Field #" + tag.ToString() + " [STRUCT_BEGIN]";
                        }
                        else
                        {
                            subNode = "[STRUCT_BEGIN]";
                        }
                        var RandKey = new Random().Next().ToString();
                        NodeStruct.CurrentNode.Nodes.Add(subNode + RandKey, subNode);
                        NodeStruct = QuickDecodeJce(subNode + RandKey, NodeStruct);
                        NodeStruct.CurrentNode.Nodes.Add("STRUCT_END");
                        break;
                    }

                    case (int)JceType.TYPE_STRUCT_END:
                    {
                        goto ExitLabel1;
                    }

                    case (int)JceType.TYPE_ZERO_TAG:
                    {
                        subNode = "Field #" + tag.ToString() + " [" + Hex + "] (Zero) Value=0";
                        NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        break;
                    }

                    case (int)JceType.TYPE_SIMPLE_LIST:
                    {
                        HeadDataStruct HD = new HeadDataStruct();
                        readHead(NodeStruct.BytesIn, ref HD);
                        NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(1).ToArray();
                        var jceDatalen = 0;
                        NodeStruct.BytesIn = SkipLength(NodeStruct.BytesIn, ref jceDatalen, ref HD);
                        if (jceDatalen > 0)
                        {
                            subNode = "Field #" + tag.ToString() + " [" + Hex + "] (SimpleList) Length=" + jceDatalen.ToString();
                            jceData = NodeStruct.BytesIn.Take(jceDatalen).ToArray();
                            if (jceData[0] == (byte)JceType.TYPE_STRUCT_BEGIN || jceData[0] == (byte)JceType.TYPE_LIST || jceData[0] == (byte)JceType.TYPE_SIMPLE_LIST || (jceData[0] == (byte)JceType.TYPE_MAP && jceData[1] == 0))
                            {
                                var RandKey = new Random().Next().ToString();
                                NodeStruct.CurrentNode.Nodes.Add(subNode + RandKey, subNode);
                                var DataRemain = NodeStruct.BytesIn.Skip(jceDatalen).ToArray();
                                NodeStruct.BytesIn = jceData;

                                QuickDecodeJce(subNode + RandKey, NodeStruct);
                                NodeStruct.BytesIn = DataRemain;
                            }
                            else
                            {
                                NodeStruct.BytesIn = NodeStruct.BytesIn.Skip(jceDatalen).ToArray();
                                subNode            = "Field #" + tag.ToString() + " [" + Hex + "] (SimpleList) Length=" + jceData.Length.ToString() + " Hex=" + BitConverter.ToString(jceData).Replace("-", "");
                                NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                            }
                        }
                        else
                        {
                            subNode = "Field #" + tag.ToString() + " [" + Hex + "] (SimpleList) Length=0";
                            NodeStruct.CurrentNode.Nodes.Add(new TreeNode(subNode));
                        }
                        MapKey = true;
                        break;
                    }
                    }
                    if (CheckLeaveStatus(NodeStruct) == true)
                    {
                        break;
                    }
                }
                ExitLabel1 :;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }

            if (!string.IsNullOrEmpty(RootKey))
            {
                TreeNode Parent = NodeStruct.CurrentNode.Parent;
                if (Parent != null)
                {
                    NodeStruct.CurrentNode = Parent;
                }
            }

            return(NodeStruct);
        }