public void VerifyXor() { var left = Enumerable.Range(0, 300).SelectMany(x => BitConverter.GetBytes(x * 27)).ToArray().AsBucket(); var right = Enumerable.Range(0, 300).Reverse().SelectMany(x => BitConverter.GetBytes(x * 31)).ToArray().AsBucket(); var xorResult = new BitwiseXorBucket(left, right).ToArray().SelectPer(4).Select(x => BitConverter.ToInt32(x, 0)); Assert.IsTrue(xorResult.SequenceEqual(Enumerable.Range(0, 300).Select(x => x * 27).Zip(Enumerable.Range(0, 300).Reverse().Select(x => x * 31), (x, y) => x ^ y))); left = Enumerable.Range(0, 600).SelectMany(x => BitConverter.GetBytes(x * 27)).ToArray().AsBucket(); right = Enumerable.Range(0, 300).Reverse().SelectMany(x => BitConverter.GetBytes(x * 31)).ToArray().AsBucket(); xorResult = new BitwiseXorBucket(left, right).ToArray().SelectPer(4).Select(x => BitConverter.ToInt32(x, 0)); Assert.IsTrue(xorResult.SequenceEqual(Enumerable.Range(0, 600).Select(x => x * 27).Zip(Enumerable.Range(0, 300).Reverse().Select(x => x * 31).Concat(Enumerable.Range(0, 300).Select(x => 0)), (x, y) => x ^ y))); left = Enumerable.Range(0, 300).SelectMany(x => BitConverter.GetBytes(x * 27)).ToArray().AsBucket(); right = Enumerable.Range(0, 600).Reverse().SelectMany(x => BitConverter.GetBytes(x * 31)).ToArray().AsBucket(); xorResult = new BitwiseXorBucket(left, right).ToArray().SelectPer(4).Select(x => BitConverter.ToInt32(x, 0)); Assert.IsTrue(xorResult.SequenceEqual(Enumerable.Range(0, 300).Select(x => x * 27).Concat(Enumerable.Range(0, 300).Select(x => 0)).Zip(Enumerable.Range(0, 600).Reverse().Select(x => x * 31), (x, y) => x ^ y))); }
public async Task Read4BitmapsXor() { string bmpFile = FindResource("*.bitmap") ?? throw new InvalidOperationException("Bitmap not found"); var fb = FileBucket.OpenRead(bmpFile); var headers = await fb.ReadFullAsync(32); // Skip headers uint count = NetBitConverter.ToUInt32(headers, 8); Assert.AreEqual(106u, count); List <GitEwahBitmapBucket> buckets = new List <GitEwahBitmapBucket>(); for (int i = 0; i < 4; i++) { buckets.Add(new GitEwahBitmapBucket(fb.Duplicate(false))); await fb.ReadNetworkUInt32Async(); // Bitlength uint u2 = await fb.ReadNetworkUInt32Async(); // Compressed length for (uint n = 0; n < u2; n++) { await fb.ReadNetworkUInt64Async(); } await fb.ReadNetworkUInt32Async(); // Last RLW start } var allXor = new BitwiseXorBucket(new BitwiseXorBucket(buckets[0], buckets[1]), new BitwiseXorBucket(buckets[2], buckets[3])); int maxBits = buckets.Max(x => x.ReadBitLengthAsync().AsTask().Result); Assert.AreEqual(2369, maxBits); var bb = await allXor.ReadFullAsync((maxBits + 7) / 8); for (int i = 0; i < bb.Length - 1; i++) { Assert.AreEqual((byte)0xFF, bb[i]); } }