私はとWrite
オペレーションの両方にCaesar暗号を適用するCaesarStream
クラスでStream
クラスを装飾しようとしています。私はWrite
メソッドをかなり簡単に上書きすることができましたが、Read
は私に頭痛を与えています。私が理解しているところでは、基底のFileStream
のRead
メソッドを呼び出す必要がありますが、それを何とか変更する必要がありますが、Write()
メソッドで行ったのと同様に、 Read
の戻り値は、実際に読み取られたアイテムではなく、読み取られたバイト数であるため、これは私にとっては難しいことです。カスタムRead()およびWrite()機能を使用してFileStreamを装飾
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)
{
//I imagine i need to call
//_stream.Read(array, offset, count);
//and modify the array, but how do i make my stream return it afterwards?
//I have no access to the underlying private FileStream fields so I'm clueless
}
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);
}
}
PS私はまた、読み出し/書き込まれたバイトの容量を確認し、それが終了されるまでの読み取り/書き込みを維持する必要があります知っているが、私はまだそれにもらっていません。私はまず読書部でやりたいです。
あなただけの唯一の '損なうことによって、同じで' array'を(修正_offset')あなたは 'Write'メソッドでそれを行います。 'array'は参照であるため、' base.Read'の戻り値以外は何も返す必要はありません - http://stackoverflow.com/questions/967402/are-arrays-or-lists-passed-デフォルトでは-cで参照されます。 –
@Eugeneちょうど私があなたを正しく理解していることを確認するために、私はFileStreamのReadを呼び出して、シフトされた0の配列を渡します。 – Marcin
@Marchinあなたは受け取った引数で 'base.Read'を呼び出し、次に配列の各要素を(' base.Read'カウントによって返されるまで)反復し、それらを適切に解読します。呼び出し元は、渡された '配列 'の中に既に解読されたデータを持ちます。 –