Ejemplo n.º 1
0
        public static int ReadIntBlock(BufferedReader reader, int[] values, int length)
        {
            int available = Math.Min(4 * length, reader.EnsureSpace(4 * length));

            Buffer.BlockCopy(reader.Buffer, reader.Index, values, 0, available);
            reader.Index += available;
            return(available / 4);
        }
Ejemplo n.º 2
0
        public static int ReadInt32(this BufferedReader reader)
        {
            reader.EnsureSpace(4);
            int value = (int)(reader.Buffer[reader.Index] | reader.Buffer[reader.Index + 1] << 8 | reader.Buffer[reader.Index + 2] << 16 | reader.Buffer[reader.Index + 3] << 24);

            reader.Index += 4;

            return(value);
        }
Ejemplo n.º 3
0
        /// <summary>
        ///  Construct a BufferedReader to read a file in one buffer.
        /// </summary>
        /// <param name="filePath">File to Read</param>
        /// <returns>BufferedReader to read whole file</returns>
        public static BufferedReader ReadAll(string filePath)
        {
            long fileSize = new FileInfo(filePath).Length;

            BufferedReader reader = new BufferedReader(File.OpenRead(filePath), new byte[fileSize + 1]);

            reader.EnsureSpace((int)(fileSize + 1));

            return(reader);
        }
Ejemplo n.º 4
0
        /// <summary>
        ///  Read the next bytes from the reader as a variable length,
        ///  7-bit encoded integer.
        /// </summary>
        /// <param name="reader">BufferedReader to read from</param>
        /// <returns>Value read</returns>
        public static ulong ReadSevenBitExplicit(BufferedReader reader, int length)
        {
            reader.EnsureSpace(length);

            ulong value = 0;
            int   shift = 0;

            for (int i = 0; i < length; ++i)
            {
                value += (ulong)(reader.Buffer[reader.Index++] & 0x7F) << shift;
                shift += 7;
            }

            return(value);
        }
Ejemplo n.º 5
0
        public bool ReadBlock(out int[] block)
        {
            if (_reader.EndOfStream)
            {
                block = null;
                return(false);
            }

            _reader.EnsureSpace(4 + BlockSize / 4 + BlockSize * 4);

            // Read delta
            //int deltaBase = _reader.ReadInt32();

            // Skip over control bytes
            int controlStart = _reader.Index;

            _reader.Index += (BlockSize / 4);

            int controlByte = 0;

            for (int i = 0; i < BlockSize; ++i)
            {
                if (i % 4 == 0)
                {
                    controlByte = _reader.Buffer[controlStart + i / 4];
                }

                // Read control byte
                int byteLength = ((controlByte & 0xC0) >> 6) + 1;
                controlByte = controlByte << 2;

                // Read value bytes
                int value = 0;
                for (int j = 0; j < byteLength; ++j)
                {
                    value  = value << 8;
                    value += _reader.Buffer[_reader.Index++];
                }

                //// Add delta
                //value += deltaBase;

                _buffer[i] = value;
            }

            block = _buffer;
            return(true);
        }
Ejemplo n.º 6
0
        /// <summary>
        ///  Read the next bytes from the reader as a variable length,
        ///  7-bit encoded integer.
        /// </summary>
        /// <param name="reader">BufferedReader to read from</param>
        /// <returns>Value read</returns>
        public static ulong ReadSevenBitTerminated(BufferedReader reader)
        {
            reader.EnsureSpace(10);

            ulong value = 0;
            int   current = 0, shift = 0;

            while (current <= 0x7F)
            {
                current = reader.Buffer[reader.Index++];
                value  += (ulong)(current & 0x7F) << shift;
                shift  += 7;
            }

            return(value);
        }
Ejemplo n.º 7
0
        /// <summary>
        ///  Read the next bytes from the reader as a variable length,
        ///  6-bit encoded integer.
        /// </summary>
        /// <param name="reader">BufferedReader to read from</param>
        /// <returns>Value read</returns>
        public static int ReadSixBitTerminatedBlock(BufferedReader reader, ulong[] block)
        {
            reader.EnsureSpace(block.Length * 11);

            int index = 0;

            while (index < block.Length && !reader.EndOfStream)
            {
                ulong value = 0;
                int   current = 0, shift = 0;

                while (current <= 0x3F)
                {
                    current = reader.Buffer[reader.Index++];
                    value  += (ulong)(current & 0x3F) << shift;
                    shift  += 6;
                }

                block[index++] = value;
            }

            return(index);
        }