Пример #1
0
        private void LoadChanged(SCBlockAccessor s1, SCBlockAccessor s2, IEnumerable <uint> shared)
        {
            foreach (var k in shared)
            {
                var x1   = s1.GetBlock(k);
                var x2   = s2.GetBlock(k);
                var name = GetKeyName(x1.Key);
                if (x1.Type != x2.Type)
                {
                    TypesChanged.Add($"{name} - {x1.Type} => {x2.Type}");
                    continue;
                }
                if (x1.Data.Length != x2.Data.Length)
                {
                    ValueChanged.Add($"{name} - Length: {x1.Data.Length} => {x2.Data.Length}");
                    continue;
                }

                if (x1.Data.Length == 0)
                {
                    continue;
                }

                if (x1.Type == SCTypeCode.Object || x1.Type == SCTypeCode.Array)
                {
                    if (!x1.Data.SequenceEqual(x2.Data))
                    {
                        ValueChanged.Add($"{name} - Bytes Changed");
                    }
                    continue;
                }

                var val1 = x1.GetValue();
                var val2 = x2.GetValue();
                if (Equals(val1, val2))
                {
                    continue;
                }
                if (val1 is ulong u1 && val2 is ulong u2)
                {
                    ValueChanged.Add($"{name} - {u1:X8} => {u2:x8}");
                }
Пример #2
0
        private void LoadAddRemove(SCBlockAccessor s1, SCBlockAccessor s2, ICollection <uint> hs1, IEnumerable <uint> hs2)
        {
            var unique = new HashSet <uint>(hs1);

            unique.SymmetricExceptWith(hs2);
            foreach (var k in unique)
            {
                var name = GetKeyName(k);
                if (hs1.Contains(k))
                {
                    var b = s1.GetBlock(k);
                    RemovedKeys.Add($"{name} - {b.Type}");
                }
                else
                {
                    var b = s2.GetBlock(k);
                    AddedKeys.Add($"{name} - {b.Type}");
                }
            }
        }
Пример #3
0
        public SCBlockCompare(SCBlockAccessor s1, SCBlockAccessor s2)
        {
            var b1    = s1.BlockInfo;
            var b2    = s2.BlockInfo;
            var names = GetKeyNames(s1, b1, b2);

            string GetKeyName(uint key) => names.TryGetValue(key, out var val) ? val : $"{key:X8}";

            var hs1 = new HashSet <uint>(b1.Select(z => z.Key));
            var hs2 = new HashSet <uint>(b2.Select(z => z.Key));

            var unique = new HashSet <uint>(hs1);

            unique.SymmetricExceptWith(hs2);
            foreach (var k in unique)
            {
                var name = GetKeyName(k);
                if (hs1.Contains(k))
                {
                    var b = s1.GetBlock(k);
                    RemovedKeys.Add($"{name} - {b.Type}");
                }
                else
                {
                    var b = s2.GetBlock(k);
                    AddedKeys.Add($"{name} - {b.Type}");
                }
            }

            hs1.IntersectWith(hs2);
            foreach (var k in hs1)
            {
                var x1   = s1.GetBlock(k);
                var x2   = s2.GetBlock(k);
                var name = GetKeyName(x1.Key);
                if (x1.Type != x2.Type)
                {
                    TypesChanged.Add($"{name} - {x1.Type} => {x2.Type}");
                    continue;
                }
                if (x1.Data.Length != x2.Data.Length)
                {
                    ValueChanged.Add($"{name} - Length: {x1.Data.Length} => {x2.Data.Length}");
                    continue;
                }

                if (x1.Data.Length == 0)
                {
                    continue;
                }

                if (x1.Type == SCTypeCode.Object || x1.Type == SCTypeCode.Array)
                {
                    if (!x1.Data.SequenceEqual(x2.Data))
                    {
                        ValueChanged.Add($"{name} - Bytes Changed");
                    }
                    continue;
                }

                var val1 = x1.GetValue();
                var val2 = x2.GetValue();
                if (Equals(val1, val2))
                {
                    continue;
                }
                if (val1 is ulong u1 && val2 is ulong u2)
                {
                    ValueChanged.Add($"{name} - {u1:X8} => {u2:x8}");
                }