2016-04-16 3 views
2

私はとWriteオペレーションの両方にCaesar暗号を適用するCaesarStreamクラスでStreamクラスを装飾しようとしています。私はWriteメソッドをかなり簡単に上書きすることができましたが、Readは私に頭痛を与えています。私が理解しているところでは、基底のFileStreamReadメソッドを呼び出す必要がありますが、それを何とか変更する必要がありますが、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私はまた、読み出し/書き込まれたバイトの容量を確認し、それが終了されるまでの読み取り/書き込みを維持する必要があります知っているが、私はまだそれにもらっていません。私はまず読書部でやりたいです。

+1

あなただけの唯一の '損なうことによって、同じで' array'を(修正_offset')あなたは 'Write'メソッドでそれを行います。 'array'は参照であるため、' base.Read'の戻り値以外は何も返す必要はありません - http://stackoverflow.com/questions/967402/are-arrays-or-lists-passed-デフォルトでは-cで参照されます。 –

+0

@Eugeneちょうど私があなたを正しく理解していることを確認するために、私はFileStreamのReadを呼び出して、シフトされた0の配列を渡します。 – Marcin

+1

@Marchinあなたは受け取った引数で 'base.Read'を呼び出し、次に配列の各要素を(' base.Read'カウントによって返されるまで)反復し、それらを適切に解読します。呼び出し元は、渡された '配列 'の中に既に解読されたデータを持ちます。 –

答えて

2

私が意図したとおりにそれを動作させるために管理ユージンの助言に続き、ここで誰かがそれを見たい場合はコードがあります:

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); 
    } 
} 
+0

これらのメソッドは、オフセットを考慮に入れてカウントする必要があります。彼らは立っているので、アレイ全体を修正します。 – usr

関連する問題