public override int Read(IOfcNumberWriter writer, Block block, StreamBitReader reader)
        {
            // ReSharper disable once AssignmentInConditionalExpression
            if (block.OverrideGlobalNb = reader.ReadByte(1) > 0)
            {
                block.NeededBits = reader.ReadByte(Metadata.MaxNeededBitsNeededBitsNumber);
            }

            // ReSharper disable once AssignmentInConditionalExpression
            if (!Metadata.IsAbsolute)
            {
                if (block.AbsoluteSign = reader.ReadByte(1) > 0)
                {
                    block.IsSignNegative = reader.ReadByte(1) > 0;
                }
            }

            var hasAbsoluteSign = block.AbsoluteSign || Metadata.IsAbsolute;
            var isNegative      = block.AbsoluteSign && block.IsSignNegative || Metadata.IsAbsolute && Metadata.IsNegative;

            for (var i = 0; i < block.Length; i++)
            {
                var num = new OfcNumber();

                if (!hasAbsoluteSign)
                {
                    isNegative = reader.ReadByte(1) > 0;
                }

                num.Number = ((long)reader.Read(Metadata.MaxNeededBitsNumber)) * (isNegative ? -1 : 1);
                writer.Write(num);
            }

            return(block.Length);
        }
Beispiel #2
0
        public void ReadBitsTest()
        {
            var Stream          = new MemoryStream(new byte[] { 0x00, 0x00, 0x01, 0xBA, 0x44, 0x00, 0x05, 0x3D, 0x1D, 0x11, 0x01, 0x86, 0xA3, 0xF8, 0x00, 0x00 });
            var StreamBitReader = new StreamBitReader(Stream);

            //Assert.AreEqual((uint)0, (uint)StreamBitReader.ReadBits(8));
            Assert.AreEqual((uint)0x000001BA, (uint)StreamBitReader.ReadBits(32));
            Assert.AreEqual((uint)0, (uint)StreamBitReader.ReadBits(2));
        }
Beispiel #3
0
        public override int Read(IOfcNumberWriter writer, Block block, StreamBitReader reader)
        {
            var value = ReadSingleValueWithoutControlBit(reader, Metadata);

            for (var i = 0; i < block.Length; i++)
            {
                writer.Write(value);
            }

            return(block.Length);
        }
Beispiel #4
0
        public override int Read(IOfcNumberWriter writer, Block block, StreamBitReader reader)
        {
            var val1 = ReadSingleValueWithoutControlBit(reader, Metadata);
            var val2 = ReadSingleValueWithoutControlBit(reader, Metadata);

            var ppLength = reader.ReadByte(8);
            var total    = ppLength * block.Length;

            for (var i = 0; i < total; i++)
            {
                writer.Write(i % (ppLength * 2) >= ppLength ? val2 : val1);
            }

            return(total);
        }
Beispiel #5
0
        protected BlockyDecompression([NotNull] Stream reader)
        {
            _bitReader = new StreamBitReader(reader);
            Metadata   = BlockyMetadata.FromBitStream(_bitReader);

            _decompressionMethods[(int)Blockfinding.Blockfinding.Methods.PatternSame]     = new PatternSameDecompression(Metadata);
            _decompressionMethods[(int)Blockfinding.Blockfinding.Methods.PatternPingPong] = new PatternPingPongDecompression(Metadata);
            _decompressionMethods[(int)Blockfinding.Blockfinding.Methods.FloatSimmilar]   = new FloatSimmilarDecompression(Metadata);
            _decompressionMethods[(int)Blockfinding.Blockfinding.Methods.NumbersNoExp]    = new NumbersNoExpDecompression(Metadata);
            _decompressionMethods[(int)Blockfinding.Blockfinding.Methods.PatternOffset]   = new PatternOffsetDecompression(Metadata);

            if (_bitReader.ReadByte(1) > 0) // use huffman
            {
                throw new NotImplementedException();
            }
        }
        public override int Read(IOfcNumberWriter writer, Block block, StreamBitReader reader)
        {
            var val1 = ReadSingleValueWithoutControlBit(reader, Metadata);
            var val2 = ReadSingleValueWithoutControlBit(reader, Metadata);

            writer.Write(val1);
            writer.Write(val2);

            var difference = val2.SubtractEach(val1);

            for (var i = 1; i < block.Length - 1; i++)
            {
                writer.Write(difference.LinearMultiplyEach(i).AddEach(val2));
            }

            return(block.Length);
        }
Beispiel #7
0
        /// <summary>
        /// Reads the metadata in its binary form
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static BlockyMetadata FromBitStream(StreamBitReader reader)
        {
            var metadata = new BlockyMetadata {
                ValueCount = (int)reader.Read(31)
            };

            // ReSharper disable once AssignmentInConditionalExpression
            if (metadata.IsAbsolute = reader.ReadByte(1) > 0)
            {
                metadata.IsNegative = reader.ReadByte(1) > 0;
            }
            metadata.MaxNeededBitsExponent         = reader.ReadByte(4);
            metadata.MaxNeededBitsNumber           = reader.ReadByte(6);
            metadata.MaxNeededBitsNeededBitsNumber = Utility.GetNeededBits(metadata.MaxNeededBitsNumber);
            metadata.LargestPossibleValue          = Utility.GetMaxValue(metadata.MaxNeededBitsNumber);
            return(metadata);
        }
Beispiel #8
0
        /// <summary>
        /// Reads a Single Value from its binary representation without the control bit (isBlock)
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public static OfcNumber ReadSingleValueWithoutControlBit(StreamBitReader reader, BlockyMetadata metadata)
        {
            var value = new OfcNumber();

            if (!metadata.IsAbsolute)
            {
                value.IsNegative = reader.ReadByte(1) > 0;
            }
            else
            {
                value.IsNegative = metadata.IsNegative;
            }
            value.Number = (long)reader.Read(metadata.MaxNeededBitsNumber);
            var isExpNegative = reader.ReadByte(1) > 0;

            value.Exponent = (short)reader.Read(metadata.MaxNeededBitsExponent); // Bug: Potentually reading exp even though NoExp is set. Same in writing method! (Ineffizient)
            if (isExpNegative)
            {
                value.Exponent *= -1;
            }
            return(value);
        }
Beispiel #9
0
        /// <summary>
        /// Exclusive IsBlock
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public static Block ReadDefaultBlockHeader(StreamBitReader reader, BlockyMetadata metadata)
        {
            var block = new Block();

            // ReSharper disable once AssignmentInConditionalExpression
            if (block.HasExponent = reader.ReadByte(1) > 0)
            {
                var negative = reader.ReadByte(1) > 0;
                block.Exponent = (short)reader.Read(metadata.MaxNeededBitsExponent);
                if (negative)
                {
                    block.Exponent *= -1;
                }
            }

            // ReSharper disable once AssignmentInConditionalExpression
            if (block.HasPattern = reader.ReadByte(1) > 0)
            {
                block.Pattern = (Block.PatternType)reader.ReadByte(2);
            }

            block.Length = reader.ReadByte(8);
            return(block);
        }
 public ZettyDecompression(Stream input, IReporter <string> output)
 {
     _output          = output;
     _stream          = input;
     _streamBitReader = new StreamBitReader(input);
 }
Beispiel #11
0
 public abstract int Read(IOfcNumberWriter writer, Block block, StreamBitReader reader);