/// <summary> /// Reads bytes from the current stream position, advancing the /// position past the data read. /// </summary> /// <param name="buffer">The destination buffer.</param> /// <param name="offset">Offset where the read data is to be copied.</param> /// <param name="count">Number of bytes to read.</param> /// <returns>The number of bytes actually read.</returns> public override int Read(byte[] buffer, int offset, int count) { int cbRemain; int cbRead; cbRemain = length - pos; cbRead = cbRemain >= count ? count : cbRemain; if (cbRead == 0) { return(0); } blocks.CopyTo(pos, buffer, offset, cbRead); pos += cbRead; return(cbRead); }
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); }
private void CopyToTest(int bufSize, int blockSize, int cbCopy) { BlockArray blocks; byte[] arr; byte[] cmp; blocks = new BlockArray(bufSize, blockSize); for (int i = 0; i < blocks.Size; i++) { blocks[i] = (byte)i; } blocks.Reset(); for (int i = 0; i < blocks.Size - cbCopy; i++) { arr = new byte[cbCopy]; cmp = new byte[cbCopy]; for (int j = 0; j < cbCopy; j++) { cmp[j] = (byte)(i + j); } blocks.CopyTo(i, arr, 0, cbCopy); Assert.Equal(cmp, arr); if (i < blocks.Size - 1) { Assert.Equal((byte)(i + 1), blocks[i + 1]); } } blocks.Reset(); for (int i = 0; i < blocks.Size - cbCopy; i++) { arr = new byte[cbCopy]; cmp = new byte[cbCopy]; for (int j = 0; j < cbCopy; j++) { cmp[j] = (byte)(i + j); } blocks.CopyTo(i, arr, 0, cbCopy); Assert.Equal(cmp, arr); } blocks.Reset(); for (int i = 0; i < blocks.Size; i++) { arr = new byte[i]; blocks.CopyTo(0, arr, 0, i); cmp = new byte[i]; for (int j = 0; j < i; j++) { cmp[j] = (byte)j; } Assert.Equal(cmp, arr); if (i < blocks.Size - 1) { Assert.Equal((byte)(i + 1), blocks[i + 1]); } } blocks.Reset(); for (int i = 0; i < blocks.Size; i++) { arr = new byte[i]; blocks.CopyTo(0, arr, 0, i); cmp = new byte[i]; for (int j = 0; j < i; j++) { cmp[j] = (byte)j; } Assert.Equal(cmp, arr); } blocks.Reset(); arr = new byte[cbCopy + 10]; cmp = new byte[cbCopy + 10]; for (int i = 0; i < cbCopy; i++) { blocks[i] = (byte)i; cmp[i + 10] = (byte)i; } blocks.CopyTo(0, arr, 10, cbCopy); Assert.Equal(cmp, arr); }