@@ -259,6 +259,24 @@ private void EnsureBlockLoaded(long position)
259259
260260 public Endianness Endian { get ; set ; }
261261
262+ public int Read ( Span < byte > buffer , int offset , int count )
263+ {
264+ int written = 0 ;
265+ while ( written < buffer . Length - offset && ( ( IReader ) this ) . Remaining > 0 )
266+ {
267+ EnsureBlockLoaded ( Position ) ;
268+
269+ var toCopy = Math . Min ( count - written , ( int ) BufferRemaining ) ;
270+
271+ _buffer . AsSpan ( ( int ) BufferPos , toCopy )
272+ . CopyTo ( buffer . Slice ( offset + written , toCopy ) ) ;
273+
274+ Position += ( uint ) toCopy ;
275+ written += toCopy ;
276+ }
277+
278+ return written ;
279+ }
262280 public byte ReadByte ( )
263281 {
264282 EnsureBlockLoaded ( Position ) ;
@@ -269,33 +287,12 @@ public byte ReadByte()
269287
270288 public byte [ ] ReadBytes ( int count )
271289 {
272- if ( count < 0 )
273- throw new ArgumentOutOfRangeException ( nameof ( count ) ) ;
274- if ( count == 0 )
275- return [ ] ;
276290 if ( ( uint ) count > ( ( IReader ) this ) . Remaining )
277291 throw new EndOfStreamException ( ) ;
278292 byte [ ] bytes = new byte [ count ] ;
279- ReadExactly ( bytes ) ;
293+ ( ( IReader ) this ) . ReadExactly ( bytes ) ;
280294 return bytes ;
281295 }
282- public void ReadExactly ( Span < byte > buffer )
283- {
284- int written = 0 ;
285- while ( written < buffer . Length )
286- {
287- EnsureBlockLoaded ( Position ) ;
288-
289- var available = ( int ) BufferRemaining ;
290- var toCopy = Math . Min ( buffer . Length - written , available ) ;
291-
292- _buffer . AsSpan ( ( int ) BufferPos , toCopy )
293- . CopyTo ( buffer . Slice ( written , toCopy ) ) ;
294-
295- Position += ( uint ) toCopy ;
296- written += toCopy ;
297- }
298- }
299296 public short ReadInt16 ( )
300297 {
301298 EnsureBlockLoaded ( Position ) ;
@@ -310,7 +307,7 @@ public short ReadInt16()
310307 }
311308
312309 Span < byte > tmp = stackalloc byte [ 2 ] ;
313- ReadExactly ( tmp ) ;
310+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
314311 return Endian == Endianness . BigEndian
315312 ? BinaryPrimitives . ReadInt16BigEndian ( tmp )
316313 : BinaryPrimitives . ReadInt16LittleEndian ( tmp ) ;
@@ -329,7 +326,7 @@ public ushort ReadUInt16()
329326 }
330327
331328 Span < byte > tmp = stackalloc byte [ 2 ] ;
332- ReadExactly ( tmp ) ;
329+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
333330 return Endian == Endianness . BigEndian
334331 ? BinaryPrimitives . ReadUInt16BigEndian ( tmp )
335332 : BinaryPrimitives . ReadUInt16LittleEndian ( tmp ) ;
@@ -348,7 +345,7 @@ public int ReadInt32()
348345 }
349346
350347 Span < byte > tmp = stackalloc byte [ 4 ] ;
351- ReadExactly ( tmp ) ;
348+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
352349 return Endian == Endianness . BigEndian
353350 ? BinaryPrimitives . ReadInt32BigEndian ( tmp )
354351 : BinaryPrimitives . ReadInt32LittleEndian ( tmp ) ;
@@ -367,7 +364,7 @@ public uint ReadUInt32()
367364 }
368365
369366 Span < byte > tmp = stackalloc byte [ 4 ] ;
370- ReadExactly ( tmp ) ;
367+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
371368 return Endian == Endianness . BigEndian
372369 ? BinaryPrimitives . ReadUInt32BigEndian ( tmp )
373370 : BinaryPrimitives . ReadUInt32LittleEndian ( tmp ) ;
@@ -386,7 +383,7 @@ public long ReadInt64()
386383 }
387384
388385 Span < byte > tmp = stackalloc byte [ 8 ] ;
389- ReadExactly ( tmp ) ;
386+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
390387 return Endian == Endianness . BigEndian
391388 ? BinaryPrimitives . ReadInt64BigEndian ( tmp )
392389 : BinaryPrimitives . ReadInt64LittleEndian ( tmp ) ;
@@ -405,7 +402,7 @@ public ulong ReadUInt64()
405402 }
406403
407404 Span < byte > tmp = stackalloc byte [ 8 ] ;
408- ReadExactly ( tmp ) ;
405+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
409406 return Endian == Endianness . BigEndian
410407 ? BinaryPrimitives . ReadUInt64BigEndian ( tmp )
411408 : BinaryPrimitives . ReadUInt64LittleEndian ( tmp ) ;
@@ -424,7 +421,7 @@ public float ReadSingle()
424421 }
425422
426423 Span < byte > tmp = stackalloc byte [ 4 ] ;
427- ReadExactly ( tmp ) ;
424+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
428425 return Endian == Endianness . BigEndian
429426 ? BinaryPrimitives . ReadSingleBigEndian ( tmp )
430427 : BinaryPrimitives . ReadSingleLittleEndian ( tmp ) ;
@@ -443,7 +440,7 @@ public double ReadDouble()
443440 }
444441
445442 Span < byte > tmp = stackalloc byte [ 8 ] ;
446- ReadExactly ( tmp ) ;
443+ ( ( IReader ) this ) . ReadExactly ( tmp ) ;
447444 return Endian == Endianness . BigEndian
448445 ? BinaryPrimitives . ReadDoubleBigEndian ( tmp )
449446 : BinaryPrimitives . ReadDoubleLittleEndian ( tmp ) ;
0 commit comments