public void DoubleBufferedStreamReaderCanSkip() { using (MemoryStream stream = this.CreateTestStream()) { byte[] expected = stream.ToArray(); var reader = new DoubleBufferedStreamReader(this.allocator, stream); int skip = 50; int plusOne = 1; int skip2 = DoubleBufferedStreamReader.ChunkLength; // Skip reader.Skip(skip); Assert.Equal(skip, reader.Position); Assert.Equal(stream.Position, reader.Position); // Read Assert.Equal(expected[skip], reader.ReadByte()); // Skip Again reader.Skip(skip2); // First Skip + First Read + Second Skip int position = skip + plusOne + skip2; Assert.Equal(position, reader.Position); Assert.Equal(stream.Position, reader.Position); Assert.Equal(expected[position], reader.ReadByte()); } }
/// <summary> /// Finds the next file marker within the byte stream. /// </summary> /// <param name="marker">The buffer to read file markers to</param> /// <param name="stream">The input stream</param> /// <returns>The <see cref="JpegFileMarker"/></returns> public static JpegFileMarker FindNextFileMarker(byte[] marker, DoubleBufferedStreamReader stream) { int value = stream.Read(marker, 0, 2); if (value == 0) { return(new JpegFileMarker(JpegConstants.Markers.EOI, stream.Length - 2)); } if (marker[0] == JpegConstants.Markers.XFF) { // According to Section B.1.1.2: // "Any marker may optionally be preceded by any number of fill bytes, which are bytes assigned code 0xFF." int m = marker[1]; while (m == JpegConstants.Markers.XFF) { int suffix = stream.ReadByte(); if (suffix == -1) { return(new JpegFileMarker(JpegConstants.Markers.EOI, stream.Length - 2)); } m = suffix; } return(new JpegFileMarker((byte)m, stream.Position - 2)); } return(new JpegFileMarker(marker[1], stream.Position - 2, true)); }
public void DoubleBufferedStreamReaderCanReadSubsequentSingleByteCorrectly() { using (MemoryStream stream = this.CreateTestStream()) { byte[] expected = stream.ToArray(); var reader = new DoubleBufferedStreamReader(this.allocator, stream); for (int i = 0; i < expected.Length; i++) { Assert.Equal(expected[i], reader.ReadByte()); Assert.Equal(i + 1, reader.Position); if (i < DoubleBufferedStreamReader.ChunkLength) { Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength); } else if (i >= DoubleBufferedStreamReader.ChunkLength && i < DoubleBufferedStreamReader.ChunkLength * 2) { // We should have advanced to the second chunk now. Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength * 2); } else { // We should have advanced to the third chunk now. Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength * 3); } } } }
public int DoubleBufferedStreamReadByte() { int r = 0; DoubleBufferedStreamReader reader = this.reader1; for (int i = 0; i < reader.Length; i++) { r += reader.ReadByte(); } return(r); }
public void DoubleBufferedStreamReaderCanReadSingleByteFromOrigin() { using (MemoryStream stream = this.CreateTestStream()) { byte[] expected = stream.ToArray(); var reader = new DoubleBufferedStreamReader(this.allocator, stream); Assert.Equal(expected[0], reader.ReadByte()); // We've read a whole chunk but increment by 1 in our reader. Assert.Equal(stream.Position, DoubleBufferedStreamReader.ChunkLength); Assert.Equal(1, reader.Position); } }