コード例 #1
0
        public async Task WorksEvenWhenSliceSizeAndNumberOfSlicesDoNotEvenlyDivideData()
        {
            var originalData = new []
            {
                (byte)'C',
                (byte)'a',
                (byte)'t'
            };
            Slice
                slice1 = Slice.Create(
                coefficients: new [] { true, false },
                data: new [] { originalData[0], originalData[1] }
                ),
                slice2 = Slice.Create(
                coefficients: new [] { true, true },
                data: new [] { (byte)(originalData[0] ^ originalData[2]), originalData[1] }
                );
            var solver = new SliceSolver(2, 3);
            await solver.RememberAsync(slice2);

            await solver.RememberAsync(slice1);

            var solution = await solver.TrySolveAsync();

            Assert.IsNotNull(solution, "Didn't find a solution");
            Assert.AreEqual(solution.Length, 3, $"Found a solution of {solution.Length} bytes, instead of 3 bytes");
            Assert.IsTrue(solution.SequenceEqual(originalData), "Found different solution than original data");
        }
コード例 #2
0
            public async Task ProducesSolvableSequenceAfterSystematicSection()
            {
                var data = new byte[]
                {
                    0x00,
                    0x01,
                    0x02,
                    0x03,
                    0x04,
                    0x05,
                    0x06,
                    0x07
                };
                var mixedSection = SliceHelpers.CreateGenerator(
                    data: data,
                    sliceSize: 2,
                    rngFactoryDelegate: () => new RandomAdapter(new Random(0)), // Seed Random so it's deterministic
                    isSystematic: true
                    ).Skip(data.Length).Take(10).ToList();
                var solver = new SliceSolver(2, data.Length);

                foreach (var slice in mixedSection)
                {
                    await solver.RememberAsync(slice);
                }
                var solution = await solver.TrySolveAsync();

                Assert.IsNotNull(solution);
                Assert.IsTrue(solution.SequenceEqual(data));
            }
コード例 #3
0
        public async Task PutsTwoSequentialSlicesBackTogetherAsync()
        {
            const byte
                value1 = 0xFF,
                value2 = 0x55;
            Slice
                slice1 = Slice.Create(
                coefficients: new [] { true, false },
                data: new [] { value1 }),
                slice2 = Slice.Create(
                coefficients: new [] { false, true },
                data: new [] { value2 });
            var solver = new SliceSolver(1, 2);
            await solver.RememberAsync(slice1);

            await solver.RememberAsync(slice2);

            var solution = await solver.TrySolveAsync();

            Assert.IsNotNull(solution, "Didn't find a solution");
            Assert.AreEqual(solution.Length, 2, $"Found a solution of {solution.Length} bytes, instead of 2 bytes");
            Assert.AreEqual(solution[0], value1, $"Found the wrong first byte: {solution[0]} instead of {value1}");
            Assert.AreEqual(solution[1], value2, $"Found the wrong second byte: {solution[1]} instead of {value2}");
        }
コード例 #4
0
        public async Task PutsOneByteBackTogetherAsync()
        {
            const byte value = 0xF5;
            var        slice = Slice.Create(
                coefficients: new [] { true },
                data: new [] { value }
                );
            var solver = new SliceSolver(1, 1);
            await solver.RememberAsync(slice);

            var solution = await solver.TrySolveAsync();

            Assert.IsNotNull(solution, "Didn't find a solution");
            Assert.AreEqual(solution.Length, 1, $"Found a solution of {solution.Length} bytes, instead of 1 byte");
            Assert.AreEqual(solution[0], value, $"Found the wrong solution: {solution[0]} instead of {value}");
        }