/// <summary>
        ///
        /// Создает новый буфер, содержащий элементы текущего буфера и, за ними, элементы заданного буфера.
        /// </summary>
        ///
        /// <param name="buffer">
        /// Буфер, который будет соединен с исходным. </param>
        ///
        /// <returns name="BinaryDataBuffer"/>
        ///
        public БуферДвоичныхДанных Соединить(БуферДвоичныхДанных buffer)
        {
            var source      = buffer._buffer;
            var totalLength = _buffer.Length + source.Length;
            var joinedArray = new byte[totalLength];

            Array.Copy(_buffer, joinedArray, _buffer.Length);
            Array.Copy(source, 0, joinedArray, _buffer.Length, source.Length);

            return(new БуферДвоичныхДанных(joinedArray, ByteOrder));
        }
        /// <summary>
        ///
        /// Заменить значения, начиная с заданной позиции, значениями из заданного буфера.
        /// </summary>
        ///
        /// <param name="position">
        /// Позиция, начиная с которой требуется записать содержимое буфера. </param>
        /// <param name="bytes">
        /// Байты, которыми нужно заполнить часть буфера. </param>
        /// <param name="number">
        /// Количество байт, которые требуется заменить. </param>
        ///
        //[ContextMethod("Записать", "Write")]
        public void Записать(int position, БуферДвоичныхДанных bytes, int number = 0)
        {
            ThrowIfReadonly();

            if (number == 0)
            {
                Array.Copy(bytes._buffer, 0, _buffer, position, bytes._buffer.Length);
            }
            else
            {
                Array.Copy(bytes._buffer, 0, _buffer, position, number);
            }
        }
        private void WriteBitwiseOp(int position, БуферДвоичныхДанных buffer, int number, Func <byte, byte, byte> op)
        {
            if (position < 0)
            {
                throw new IndexOutOfRangeException("Значение индекса выходит за границы диапазона");
            }

            try
            {
                var bytesToCopy = (number == 0 ? buffer._buffer.Length : number);
                for (int i = 0; i < bytesToCopy; i++)
                {
                    _buffer[i + position] = op(_buffer[i + position], buffer._buffer[i]);
                }
            }
            catch (IndexOutOfRangeException)
            {
                throw new IndexOutOfRangeException("Переполнение при работе с буфером");
            }
        }
Exemple #4
0
 /// <summary>
 ///
 /// Записывает в поток заданное количество байтов из буфера по заданному смещению. Если в буфере меньше данных, чем требуется записать, вызывается исключение о недостаточном количестве данных в буфере.
 /// Запись в поток возможна только, если поток поддерживает запись. В противном случае при вызове метода будет вызвано исключение.
 /// </summary>
 ///
 /// <param name="buffer">
 /// Буфер, из которого выбираются данные для записи. </param>
 /// <param name="positionInBuffer">
 /// Позиция в буфере, начиная с которой данные будут получены для записи в поток. </param>
 /// <param name="number">
 /// Количество байт, которые требуется записать. </param>
 ///
 public void Записать(БуферДвоичныхДанных buffer, int positionInBuffer, int number)
 {
     _commonImpl.Write(buffer, positionInBuffer, number);
 }
Exemple #5
0
 /// <summary>
 ///
 /// Выполняет чтение заданного количества байтов в указанный буфер по указанному смещению. Текущая позиция смещается вперед на фактическое количество прочитанных байтов.
 /// Чтение из потока возможно только, если поток поддерживает чтение. В противном случае, будет вызвано исключение.
 /// При чтении размер целевого буфера не меняется, а его содержимое перезаписывается фактически прочитанными данными. Если в буфере недостаточно места для записи прочитанных данных, происходит ошибка переполнения.
 /// </summary>
 ///
 /// <param name="buffer">
 /// Буфер, в который выполняется чтение. </param>
 /// <param name="positionInBuffer">
 /// Позиция в целевом буфере, начиная с которой требуется записывать данные из потока. </param>
 /// <param name="number">
 /// Количество байт, которые требуется записать в целевой буфер. </param>
 ///
 /// <returns name="number">
 /// Возвращает число прочитанных байт
 /// </returns>
 ///
 public long Прочитать(БуферДвоичныхДанных buffer, int positionInBuffer, int number)
 {
     return(_commonImpl.Read(buffer, positionInBuffer, number));
 }
 /// <summary>
 ///
 /// Объединить заданное количество байтов, начиная с указанной позиции с байтами из заданного буфера
 /// с использованием побитового ИСКЛЮЧИТЕЛЬНОГО ИЛИ (XOR).
 /// Если количество байтов не указано, то объединяются все байты до конца буфера.
 /// </summary>
 ///
 /// <param name="position">
 /// Начальная позиция в буфере. </param>
 /// <param name="bytes">
 /// Буфер, с которым выполняется объединение. </param>
 /// <param name="number">
 /// Количество байт, которые требуется объединить. </param>
 ///
 public void ЗаписатьПобитовоеИсключительноеИли(int position, БуферДвоичныхДанных bytes, int number = 0)
 {
     ThrowIfReadonly();
     WriteBitwiseOp(position, bytes, number, ((i, j) => (byte)(i ^ j)));
 }
Exemple #7
0
 MemoryStreamContext(БуферДвоичныхДанных bytes)
 {
     _underlyingStream      = new MemoryStream(bytes.Bytes);
     _shouldBeCopiedOnClose = !bytes.ТолькоЧтение;
     _commonImpl            = new GenericStreamImpl(_underlyingStream);
 }
 public long Read(БуферДвоичныхДанных buffer, int positionInBuffer, int number)
 {
     return(_underlyingStream.Read(buffer.Bytes, positionInBuffer, number));
 }
 public void Write(БуферДвоичныхДанных buffer, int positionInBuffer, int number)
 {
     buffer.ThrowIfReadonly();
     _underlyingStream.Write(buffer.Bytes, positionInBuffer, number);
 }