mirror of
https://github.com/crskycode/GARbro.git
synced 2026-07-08 01:30:18 +08:00
(XoredStream): moved to CommonStreams.
This commit is contained in:
@@ -393,4 +393,55 @@ namespace GameRes.Formats
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class XoredStream : ProxyStream
|
||||||
|
{
|
||||||
|
private byte m_key;
|
||||||
|
|
||||||
|
public XoredStream (Stream stream, byte key, bool leave_open = false)
|
||||||
|
: base (stream, leave_open)
|
||||||
|
{
|
||||||
|
m_key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region System.IO.Stream methods
|
||||||
|
public override int Read (byte[] buffer, int offset, int count)
|
||||||
|
{
|
||||||
|
int read = BaseStream.Read (buffer, offset, count);
|
||||||
|
for (int i = 0; i < read; ++i)
|
||||||
|
{
|
||||||
|
buffer[offset+i] ^= m_key;
|
||||||
|
}
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int ReadByte ()
|
||||||
|
{
|
||||||
|
int b = BaseStream.ReadByte();
|
||||||
|
if (-1 != b)
|
||||||
|
{
|
||||||
|
b ^= m_key;
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] write_buf;
|
||||||
|
|
||||||
|
public override void Write (byte[] buffer, int offset, int count)
|
||||||
|
{
|
||||||
|
if (null == write_buf || write_buf.Length < count)
|
||||||
|
write_buf = new byte[count];
|
||||||
|
for (int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
write_buf[i] = (byte)(buffer[offset+i] ^ m_key);
|
||||||
|
}
|
||||||
|
BaseStream.Write (write_buf, 0, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteByte (byte value)
|
||||||
|
{
|
||||||
|
BaseStream.WriteByte ((byte)(value ^ m_key));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,101 +64,4 @@ namespace GameRes.Formats.ScenePlayer
|
|||||||
return base.Read (zstream, info);
|
return base.Read (zstream, info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class XoredStream : Stream
|
|
||||||
{
|
|
||||||
private Stream m_stream;
|
|
||||||
private byte m_key;
|
|
||||||
private bool m_should_dispose;
|
|
||||||
|
|
||||||
public Stream BaseStream { get { return m_stream; } }
|
|
||||||
|
|
||||||
public override bool CanRead { get { return m_stream.CanRead; } }
|
|
||||||
public override bool CanSeek { get { return m_stream.CanSeek; } }
|
|
||||||
public override bool CanWrite { get { return m_stream.CanWrite; } }
|
|
||||||
public override long Length { get { return m_stream.Length; } }
|
|
||||||
public override long Position
|
|
||||||
{
|
|
||||||
get { return m_stream.Position; }
|
|
||||||
set { m_stream.Position = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public XoredStream (Stream stream, byte key, bool leave_open = false)
|
|
||||||
{
|
|
||||||
m_stream = stream;
|
|
||||||
m_key = key;
|
|
||||||
m_should_dispose = !leave_open;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region System.IO.Stream methods
|
|
||||||
public override void Flush()
|
|
||||||
{
|
|
||||||
m_stream.Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override long Seek (long offset, SeekOrigin origin)
|
|
||||||
{
|
|
||||||
return m_stream.Seek (offset, origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetLength (long length)
|
|
||||||
{
|
|
||||||
m_stream.SetLength (length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int Read (byte[] buffer, int offset, int count)
|
|
||||||
{
|
|
||||||
int read = m_stream.Read (buffer, offset, count);
|
|
||||||
for (int i = 0; i < read; ++i)
|
|
||||||
{
|
|
||||||
buffer[offset+i] ^= m_key;
|
|
||||||
}
|
|
||||||
return read;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int ReadByte ()
|
|
||||||
{
|
|
||||||
int b = m_stream.ReadByte();
|
|
||||||
if (-1 != b)
|
|
||||||
{
|
|
||||||
b ^= m_key;
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] write_buf;
|
|
||||||
|
|
||||||
public override void Write (byte[] buffer, int offset, int count)
|
|
||||||
{
|
|
||||||
if (null == write_buf || write_buf.Length < count)
|
|
||||||
write_buf = new byte[count];
|
|
||||||
for (int i = 0; i < count; ++i)
|
|
||||||
{
|
|
||||||
write_buf[i] = (byte)(buffer[offset+i] ^ m_key);
|
|
||||||
}
|
|
||||||
m_stream.Write (write_buf, 0, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void WriteByte (byte value)
|
|
||||||
{
|
|
||||||
m_stream.WriteByte ((byte)(value ^ m_key));
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IDisposable Members
|
|
||||||
bool disposed = false;
|
|
||||||
protected override void Dispose (bool disposing)
|
|
||||||
{
|
|
||||||
if (!disposed)
|
|
||||||
{
|
|
||||||
if (disposing && m_should_dispose)
|
|
||||||
{
|
|
||||||
m_stream.Dispose();
|
|
||||||
}
|
|
||||||
disposed = true;
|
|
||||||
base.Dispose (disposing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user