Example #1
0
        public void ReadMultiByte()
        {
            var bytes = BitConverter.GetBytes(0b11001001_11001001);
            var bs    = new BitReadStream(bytes);

            Assert.AreEqual <ulong>(0b1001, bs.Read(4));
            Assert.AreEqual <ulong>(0b10011100, bs.Read(8));

            Assert.AreEqual(12, bs.Position);
        }
Example #2
0
        public void DecodeFlag()
        {
            var bytes = BitConverter.GetBytes(0b10011_10); // val = 0x33
            var bs    = new BitReadStream(bytes);

            var(rlen, rmap) = TransformTable.DecodeFlag(bs);
            Assert.AreEqual <int>(5, rlen);

            var rval = (int)bs.Read(rlen);

            Assert.AreEqual <byte>(0x33, rmap[rval]);
        }
Example #3
0
        public byte[] Decode(byte[] flag, byte[] residual)
        {
            var flagIn = new BitReadStream(flag);
            var resOut = new ByteBuffer();

            // Actual residual length
            int resLength = residual.Length;

            try {
                while (!flagIn.IsEOF)
                {
                    // Parse residual header
                    int kset  = residual[0] >> 3;
                    int fbits = residual[0] & 7;

                    // Initialize residual reader and discard header
                    var resIn = new BitReadStream(residual, resLength * 8 - fbits);
                    resIn.Read(8);

                    // Perform inverse MV2 substitutions
                    for (int i = 0; !resIn.IsEOF; i++)
                    {
                        var(rlen, rmap) = TransformTable.DecodeFlag(flagIn);
                        byte val = rmap[resIn.Read(rlen)];

                        // Unscramble byte values after MV2 decoding
                        val = key.XorByte(key.Decode(val, kset), i);
                        resOut.Write(val);
                    }

                    // Skip flag padding
                    flagIn.FinishByte();

                    // Forward the residual to the next round
                    residual  = resOut.GetBytesInternal();
                    resLength = resOut.Position;
                    resOut.Reset();
                }
            } catch (ArgumentException ex) {
                throw new DecoderException(ex);
            } catch (IndexOutOfRangeException ex) {
                throw new DecoderException(ex);
            }

            // Trim final output
            var output = new byte[resLength];

            Array.Copy(residual, output, resLength);

            return(output);
        }
Example #4
0
        public void ReadOneBit()
        {
            var bytes = BitConverter.GetBytes(0b00110110_11001001);
            var bs    = new BitReadStream(bytes);

            var expected = new[] {
                true, false, false, true, false, false, true, true,
                false, true, true, false, true, true, false, false,
            };

            foreach (var bit in expected)
            {
                Assert.AreEqual(bit, bs.Read());
            }
        }
Example #5
0
        public void ReadOutOfRange()
        {
            var bytes = new[] { (byte)0xFF };
            var bs    = new BitReadStream(bytes);

            bs.Read(5);

            try {
                bs.Read(4);
                Assert.Fail();
            } catch (ArgumentException) {
                // Should happen due to out of range read
                Assert.AreEqual <long>(5, bs.Position);
            }
        }
Example #6
0
        public void SimpleDecode()
        {
            var bytes = BitConverter.GetBytes(0b100000110110);
            var bs    = new BitReadStream(bytes);

            var pd = new PrefixDecoder <int>(new[] {