public Dictionary<string, object> GetValues(DcObject dcObject) { Dictionary<string, object> values = new Dictionary<string, object>(); for (int i = 0; i < dcObject.ArgsCount; i++) { var val = Values[dcObject.ArgsShift + i]; values.Add(val.Key, val.Value); } for (int i = 0; i < dcObject.SubCount; i++) { DcObject val = Objects[dcObject.SubShift + i]; if (!values.ContainsKey(val.Name)) values.Add(val.Name, new List<Dictionary<string, object>>()); List<Dictionary<string, object>> vals = (List<Dictionary<string, object>>) values[val.Name]; vals.Add(GetValues(val)); } return values; }
static void ReadObjects(string path) { DcObjects = new List<DcObject>(); using (FileStream decStream = File.OpenRead(path)) { long del = 0xFFFF0; while (decStream.Position < decStream.Length) { byte[] data = new byte[16]; if (decStream.Position == del) { decStream.Read(data, 0, 8); del += 0x100008; } decStream.Read(data, 0, data.Length); string keyHex = BitConverter.ToString(data, 0, 2).Replace("-", " "); string name = Args[keyHex]; int argsCount = BitConverter.ToUInt16(data, 4); int subCount = BitConverter.ToUInt16(data, 6); byte[] shiftData = new byte[4]; shiftData[0] = data[10]; shiftData[1] = data[11]; shiftData[2] = data[8]; shiftData[3] = data[9]; int argsShift = BitConverter.ToInt32(shiftData, 0); shiftData[0] = data[14]; shiftData[1] = data[15]; shiftData[2] = data[12]; shiftData[3] = data[13]; int subShift = BitConverter.ToInt32(shiftData, 0) - 1; DcObject dcObject = new DcObject { Name = name, ArgsCount = argsCount, ArgsShift = argsShift, SubCount = subCount, SubShift = subShift, }; DcObjects.Add(dcObject); } } }
static void ReadObjects(string path) { int counter = 1; ; DcObjects = new List<DcObject>(); List<string> log = new List<string>(); using (FileStream decStream = File.OpenRead(path)) { //first Spacer long del = 0xFFFF0; while (decStream.Position < decStream.Length) { byte[] data = new byte[16]; if (decStream.Position == del) { decStream.Read(data, 0, 8); //every (65536 objects (+ 1 nullvalue object (x 16 bytes) = ) 1048576 bytes is the next spacer located del += 0x100008; } decStream.Read(data, 0, data.Length); string keyHex = BitConverter.ToString(data, 0, 2).Replace("-", " "); string name = Args[keyHex]; int argsCount = BitConverter.ToUInt16(data, 4); int subCount = BitConverter.ToUInt16(data, 6); // Data Structure Example : D6 00, 00 00, 04 00, 00 00, 00 00 0C 00, FF FF FF FF // Arg (D6 00),nothing (00 00),argsCount (04 00) subCount (00 00), argsShift (00 00 0C 00), subShift (FF FF FF FF) //just invert the byteStreamData to get out a valid int byte[] shiftData = new byte[4]; shiftData[0] = data[10]; shiftData[1] = data[11]; shiftData[2] = data[8]; shiftData[3] = data[9]; int argsShift = BitConverter.ToInt32(shiftData, 0); shiftData[0] = data[14]; shiftData[1] = data[15]; shiftData[2] = data[12]; shiftData[3] = data[13]; int subShift = BitConverter.ToInt32(shiftData, 0) - 1; DcObject dcObject = new DcObject { Name = name, ArgsCount = argsCount, ArgsShift = argsShift, SubCount = subCount, SubShift = subShift, }; DcObjects.Add(dcObject); txt = "\rprocessing Objects : " + DcObjects.Count; Console.Write(txt + " - {0}%", (100f*decStream.Position/decStream.Length).ToString("0.00")); counter++; } Console.WriteLine(txt + " - DONE "); } }