/// <summary> /// Writes bytes to the stream at the current position, advancing /// the position past the data written. /// </summary> /// <param name="buffer">The source buffer.</param> /// <param name="offset">Offset of the first byte to write.</param> /// <param name="count">Number of bytes to read.</param> public override void Write(byte[] buffer, int offset, int count) { try { unchecked { if (pos + count < 0) // Checking for wraparound { throw new IOException(TooLongError); } } blocks.ExtendTo(pos + count); blocks.CopyFrom(buffer, offset, pos, count); pos += count; if (pos > length) { length = pos; } } catch { throw new IOException(); } }
private void CopyFromTest(int bufSize, int blockSize, int cbCopy) { BlockArray blocks; byte[] arr; byte[] cmp; int pos; blocks = new BlockArray(bufSize, blockSize); Zero(blocks); arr = new byte[cbCopy]; for (int i = 0; i < cbCopy; i++) { arr[i] = (byte)i; } blocks.CopyFrom(arr, 0, 0, cbCopy); cmp = new byte[bufSize]; for (int i = 0; i < cbCopy; i++) { cmp[i] = (byte)i; } arr = new byte[bufSize]; blocks.CopyTo(0, arr, 0, bufSize); Assert.Equal(cmp, arr); Zero(blocks); arr = new byte[cbCopy]; for (int i = 0; i < cbCopy; i++) { arr[i] = (byte)i; } if (cbCopy == 0) { return; } pos = 0; for (int i = 0; i < blockSize / cbCopy; i++) { blocks.CopyFrom(arr, 0, pos, cbCopy); pos += cbCopy; } pos = 0; cmp = new byte[bufSize]; for (int i = 0; i < blockSize / cbCopy; i++) { for (int j = 0; j < cbCopy; j++) { cmp[pos++] = (byte)j; } } arr = new byte[bufSize]; blocks.CopyTo(0, arr, 0, bufSize); Assert.Equal(cmp, arr); Zero(blocks); arr = new byte[cbCopy + 10]; cmp = new byte[cbCopy + 10]; for (int i = 0; i < cbCopy; i++) { cmp[i + 10] = (byte)i; } blocks.CopyFrom(cmp, 10, 0, cbCopy); blocks.CopyTo(0, arr, 10, cbCopy); Assert.Equal(cmp, arr); }