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