diff --git a/src/SharpCompress/Common/EntryStream.cs b/src/SharpCompress/Common/EntryStream.cs
index 4697ff8c..8d40cabd 100644
--- a/src/SharpCompress/Common/EntryStream.cs
+++ b/src/SharpCompress/Common/EntryStream.cs
@@ -66,6 +66,16 @@ namespace SharpCompress.Common
return read;
}
+ public override int ReadByte()
+ {
+ int value = _stream.ReadByte();
+ if (value == -1)
+ {
+ _completed = true;
+ }
+ return value;
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
diff --git a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs
index d7ea3040..25300840 100644
--- a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs
+++ b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs
@@ -72,6 +72,22 @@ namespace SharpCompress.Common.Tar
return read;
}
+ public override int ReadByte()
+ {
+ if (BytesLeftToRead <= 0)
+ {
+ return -1;
+ }
+ int value = Stream.ReadByte();
+ if (value != -1)
+ {
+ --BytesLeftToRead;
+ ++_amountRead;
+ }
+ return value;
+
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
diff --git a/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs b/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs
index 4566bf03..c0f040a9 100644
--- a/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs
+++ b/src/SharpCompress/Compressors/BZip2/BZip2Stream.cs
@@ -67,6 +67,11 @@ namespace SharpCompress.Compressors.BZip2
return stream.Read(buffer, offset, count);
}
+ public override int ReadByte()
+ {
+ return stream.ReadByte();
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
return stream.Seek(offset, origin);
@@ -82,6 +87,11 @@ namespace SharpCompress.Compressors.BZip2
stream.Write(buffer, offset, count);
}
+ public override void WriteByte(byte value)
+ {
+ stream.WriteByte(value);
+ }
+
///
/// Consumes two bytes to test if there is a BZip2 header
///
diff --git a/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs b/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs
index 4168db4b..68d924b4 100644
--- a/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs
+++ b/src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs
@@ -1077,6 +1077,10 @@ namespace SharpCompress.Compressors.BZip2
{
}
+ public override void WriteByte(byte value)
+ {
+ }
+
public override bool CanRead => true;
public override bool CanSeek => false;
diff --git a/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs b/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs
index 38922294..e95ddb36 100644
--- a/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs
+++ b/src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs
@@ -1929,6 +1929,11 @@ namespace SharpCompress.Compressors.BZip2
return 0;
}
+ public override int ReadByte()
+ {
+ return -1;
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
return 0;
diff --git a/src/SharpCompress/Compressors/Deflate/DeflateStream.cs b/src/SharpCompress/Compressors/Deflate/DeflateStream.cs
index a771d66e..e095f460 100644
--- a/src/SharpCompress/Compressors/Deflate/DeflateStream.cs
+++ b/src/SharpCompress/Compressors/Deflate/DeflateStream.cs
@@ -282,6 +282,15 @@ namespace SharpCompress.Compressors.Deflate
return _baseStream.Read(buffer, offset, count);
}
+ public override int ReadByte()
+ {
+ if (_disposed)
+ {
+ throw new ObjectDisposedException("DeflateStream");
+ }
+ return _baseStream.ReadByte();
+ }
+
///
/// Calling this method always throws a .
///
@@ -340,6 +349,15 @@ namespace SharpCompress.Compressors.Deflate
_baseStream.Write(buffer, offset, count);
}
+ public override void WriteByte(byte value)
+ {
+ if (_disposed)
+ {
+ throw new ObjectDisposedException("DeflateStream");
+ }
+ _baseStream.WriteByte(value);
+ }
+
#endregion
public MemoryStream InputBuffer => new MemoryStream(_baseStream._z.InputBuffer, _baseStream._z.NextIn,
diff --git a/src/SharpCompress/Compressors/Deflate/ZlibStream.cs b/src/SharpCompress/Compressors/Deflate/ZlibStream.cs
index 6a644f39..c82040ef 100644
--- a/src/SharpCompress/Compressors/Deflate/ZlibStream.cs
+++ b/src/SharpCompress/Compressors/Deflate/ZlibStream.cs
@@ -270,6 +270,15 @@ namespace SharpCompress.Compressors.Deflate
return _baseStream.Read(buffer, offset, count);
}
+ public override int ReadByte()
+ {
+ if (_disposed)
+ {
+ throw new ObjectDisposedException("ZlibStream");
+ }
+ return _baseStream.ReadByte();
+ }
+
///
/// Calling this method always throws a .
///
@@ -321,6 +330,15 @@ namespace SharpCompress.Compressors.Deflate
_baseStream.Write(buffer, offset, count);
}
+ public override void WriteByte(byte value)
+ {
+ if (_disposed)
+ {
+ throw new ObjectDisposedException("ZlibStream");
+ }
+ _baseStream.WriteByte(value);
+ }
+
#endregion System.IO.Stream methods
}
}
\ No newline at end of file
diff --git a/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs b/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs
index 3dc78c3a..4bdac69b 100644
--- a/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs
+++ b/src/SharpCompress/Compressors/LZMA/Bcj2DecoderStream.cs
@@ -193,6 +193,22 @@ namespace SharpCompress.Compressors.LZMA
return count;
}
+ public override int ReadByte()
+ {
+ if (_mFinished)
+ {
+ return -1;
+ }
+
+ if (!_mIter.MoveNext())
+ {
+ _mFinished = true;
+ return -1;
+ }
+
+ return _mIter.Current;
+ }
+
public IEnumerable Run()
{
const uint kBurstSize = (1u << 18);
diff --git a/src/SharpCompress/Compressors/LZMA/LZipStream.cs b/src/SharpCompress/Compressors/LZMA/LZipStream.cs
index 5cedeb6c..588386f5 100644
--- a/src/SharpCompress/Compressors/LZMA/LZipStream.cs
+++ b/src/SharpCompress/Compressors/LZMA/LZipStream.cs
@@ -110,6 +110,8 @@ namespace SharpCompress.Compressors.LZMA
public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count);
+ public override int ReadByte() => _stream.ReadByte();
+
public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
public override void SetLength(long value) => throw new NotImplementedException();
@@ -120,6 +122,12 @@ namespace SharpCompress.Compressors.LZMA
_writeCount += count;
}
+ public override void WriteByte(byte value)
+ {
+ _stream.WriteByte(value);
+ ++_writeCount;
+ }
+
#endregion
///
diff --git a/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs b/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs
index 66d02e91..cd2869c9 100644
--- a/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs
+++ b/src/SharpCompress/Compressors/Xz/Filters/Lzma2Filter.cs
@@ -51,5 +51,10 @@ namespace SharpCompress.Compressors.Xz.Filters
{
return BaseStream.Read(buffer, offset, count);
}
+
+ public override int ReadByte()
+ {
+ return BaseStream.ReadByte();
+ }
}
}
diff --git a/src/SharpCompress/Crypto/Crc32Stream.cs b/src/SharpCompress/Crypto/Crc32Stream.cs
index 13cbc6e2..35dd85bd 100644
--- a/src/SharpCompress/Crypto/Crc32Stream.cs
+++ b/src/SharpCompress/Crypto/Crc32Stream.cs
@@ -47,6 +47,12 @@ namespace SharpCompress.Crypto
hash = CalculateCrc(table, hash, buffer, offset, count);
}
+ public override void WriteByte(byte value)
+ {
+ stream.WriteByte(value);
+ hash = CalculateCrc(table, hash, value);
+ }
+
public override bool CanRead => stream.CanRead;
public override bool CanSeek => false;
public override bool CanWrite => stream.CanWrite;
@@ -98,9 +104,16 @@ namespace SharpCompress.Crypto
unchecked
{
for (int i = offset, end = offset + count; i < end; i++)
- crc = (crc >> 8) ^ table[(crc ^ buffer[i]) & 0xFF];
+ {
+ crc = CalculateCrc(table, crc, buffer[i]);
+ }
}
return crc;
}
+
+ private static uint CalculateCrc(uint[] table, uint crc, byte b)
+ {
+ return (crc >> 8) ^ table[(crc ^ b) & 0xFF];
+ }
}
}
diff --git a/src/SharpCompress/IO/CountingWritableSubStream.cs b/src/SharpCompress/IO/CountingWritableSubStream.cs
index c08235c6..17ddf6bb 100644
--- a/src/SharpCompress/IO/CountingWritableSubStream.cs
+++ b/src/SharpCompress/IO/CountingWritableSubStream.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.IO;
namespace SharpCompress.IO
@@ -49,5 +49,11 @@ namespace SharpCompress.IO
writableStream.Write(buffer, offset, count);
Count += (uint)count;
}
+
+ public override void WriteByte(byte value)
+ {
+ writableStream.WriteByte(value);
+ ++Count;
+ }
}
}
\ No newline at end of file
diff --git a/src/SharpCompress/IO/ListeningStream.cs b/src/SharpCompress/IO/ListeningStream.cs
index 1cc694e0..a5a76dd1 100644
--- a/src/SharpCompress/IO/ListeningStream.cs
+++ b/src/SharpCompress/IO/ListeningStream.cs
@@ -47,6 +47,19 @@ namespace SharpCompress.IO
return read;
}
+ public override int ReadByte()
+ {
+ int value = Stream.ReadByte();
+ if (value == -1)
+ {
+ return -1;
+ }
+
+ ++currentEntryTotalReadBytes;
+ listener.FireCompressedBytesRead(currentEntryTotalReadBytes, currentEntryTotalReadBytes);
+ return value;
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
return Stream.Seek(offset, origin);
@@ -61,5 +74,10 @@ namespace SharpCompress.IO
{
Stream.Write(buffer, offset, count);
}
+
+ public override void WriteByte(byte value)
+ {
+ Stream.WriteByte(value);
+ }
}
}
\ No newline at end of file
diff --git a/src/SharpCompress/IO/NonDisposingStream.cs b/src/SharpCompress/IO/NonDisposingStream.cs
index 319f9461..2c9e72c4 100644
--- a/src/SharpCompress/IO/NonDisposingStream.cs
+++ b/src/SharpCompress/IO/NonDisposingStream.cs
@@ -44,6 +44,11 @@ namespace SharpCompress.IO
return Stream.Read(buffer, offset, count);
}
+ public override int ReadByte()
+ {
+ return Stream.ReadByte();
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
return Stream.Seek(offset, origin);
@@ -58,5 +63,10 @@ namespace SharpCompress.IO
{
Stream.Write(buffer, offset, count);
}
+
+ public override void WriteByte(byte value)
+ {
+ Stream.WriteByte(value);
+ }
}
}
\ No newline at end of file
diff --git a/src/SharpCompress/IO/ReadOnlySubStream.cs b/src/SharpCompress/IO/ReadOnlySubStream.cs
index a8449c41..8747019a 100644
--- a/src/SharpCompress/IO/ReadOnlySubStream.cs
+++ b/src/SharpCompress/IO/ReadOnlySubStream.cs
@@ -51,6 +51,20 @@ namespace SharpCompress.IO
return read;
}
+ public override int ReadByte()
+ {
+ if (BytesLeftToRead <= 0)
+ {
+ return -1;
+ }
+ int value = Stream.ReadByte();
+ if (value != -1)
+ {
+ --BytesLeftToRead;
+ }
+ return value;
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
diff --git a/tests/SharpCompress.Test/ForwardOnlyStream.cs b/tests/SharpCompress.Test/ForwardOnlyStream.cs
index d9cf85e3..c20b9b99 100644
--- a/tests/SharpCompress.Test/ForwardOnlyStream.cs
+++ b/tests/SharpCompress.Test/ForwardOnlyStream.cs
@@ -44,6 +44,11 @@ namespace SharpCompress.Test
return stream.Read(buffer, offset, count);
}
+ public override int ReadByte()
+ {
+ return stream.ReadByte();
+ }
+
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
@@ -55,7 +60,8 @@ namespace SharpCompress.Test
}
public override void Write(byte[] buffer, int offset, int count)
- {throw new NotSupportedException();
+ {
+ throw new NotSupportedException();
}
}
}
\ No newline at end of file
diff --git a/tests/SharpCompress.Test/Zip/Zip64Tests.cs b/tests/SharpCompress.Test/Zip/Zip64Tests.cs
index d1e105a6..dba69199 100644
--- a/tests/SharpCompress.Test/Zip/Zip64Tests.cs
+++ b/tests/SharpCompress.Test/Zip/Zip64Tests.cs
@@ -205,6 +205,9 @@ namespace SharpCompress.Test.Zip
public override int Read(byte[] buffer, int offset, int count)
{ return stream.Read(buffer, offset, count); }
+ public override int ReadByte()
+ { return stream.ReadByte(); }
+
public override long Seek(long offset, SeekOrigin origin)
{ throw new NotImplementedException(); }
@@ -213,6 +216,9 @@ namespace SharpCompress.Test.Zip
public override void Write(byte[] buffer, int offset, int count)
{ stream.Write(buffer, offset, count); }
+
+ public override void WriteByte(byte value)
+ { stream.WriteByte(value); }
}
}
}
\ No newline at end of file