/// <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("Переполнение при работе с буфером"); } }
/// <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); }
/// <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))); }
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); }