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); }
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]); }
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); }
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()); } }
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); } }
public void SimpleDecode() { var bytes = BitConverter.GetBytes(0b100000110110); var bs = new BitReadStream(bytes); var pd = new PrefixDecoder <int>(new[] {