使用自定义Read()和Write()功能装饰FileStream

时间:2016-04-16 20:07:04

标签: c# stream decorator filestream

我正在尝试使用Stream类来装饰CaesarStream类,它基本上将Caesar密码应用于ReadWrite操作。我已经成功地轻松覆盖了Write方法,但是Read让我很头疼。根据我的理解,我需要调用底层FileStream的{​​{1}}方法并以某种方式修改它,但是如何让它读取值同时还为每个字节添加一个数字,类似于我用Read方法做了什么?这对我来说更难,因为Write()的返回值只是读取的字节数,而不是实际的读取项。

Read

PS我知道我也应该检查读/写的字节数并继续读/写,直到它完成,但我还没有达到。我想先完成阅读部分。

1 个答案:

答案 0 :(得分:2)

根据Eugene的建议,我设法让它按预期工作,这是代码,以防有人想看到它:

public class CaesarStream : Stream
{
    private int _offset;
    private FileStream _stream;


    public CaesarStream(FileStream stream, int offset)
    {
        _offset = offset;
        _stream = stream;
    }

    public override int Read(byte[] array, int offset, int count)
    {
        int retValue = _stream.Read(array, offset, count);

        for (int a = 0; a < array.Length; a++)
        {
            array[a] = (byte) (array[a] - (byte) _offset);
        }

        return retValue;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        byte[] changedBytes = new byte[buffer.Length];

        int index = 0;
        foreach (byte b in buffer)
        {
            changedBytes[index] = (byte) (b + (byte) _offset);
            index++;
        }

        _stream.Write(changedBytes, offset, count);
    }
}