2017-01-24 5 views
0

os.Fileのモックを作成しようとしています。具体的にはio.Readerです。私は実際の読書なしに128ビットの具体的なデータの読みをエミュレートしたい。uint32の配列をバイトのスライスに書き込み、それを取得します。

単一のuint32で問題はありません。

モック:

func (f *FileMock) Read(buf []byte) (n int, err error) { 
    binary.BigEndian.PutUint32(buf, uint32(2052)) 
    return len(buf), nil 
}  

テスト済みの方法(簡体字):それは最初からスライスに書き込むため

b := make([]byte, 128)              
meta_data := make([]uint32, 4)                                 
_, err = s.Read(b)                   
if err != nil {                    
    // Handle error   
}                                              
binary.Read(bytes.NewBuffer(b), binary.BigEndian, &meta_data)                                
log.Print(meta_data) // Output [2052 0 0 0] 

しかし、私はuint32スライスPutUint32の読み取りをモックする必要があります(役に立ちません以前に作成されたデータを上書きする)。私はbytesbinaryツールの組み合わせを試しましたが、バイトからデータを戻すことができないたびに幸運はありませんでした。私は空のスライス[0, 0, 0, 0]を取得しています上記と同様のテスト方法で

func (f *FileMock) Read(b []byte) (n int, err error) { 
    buf := bytes.NewBuffer(make([]byte, len(b))) 
    err = binary.Write(buf, binary.BigEndian, [4]uint32{2051, 123, 28, 28}) 
    buf.Read(b) 
    return len(b), nil 
} 

:私の最後の試みは、(それがないだけです)があります。 これはos.File.Readメソッドのモックであるため、既存のスライスにデータを書き込む必要はなく、新しいスライスのバイトを作成することはできません。

まず、この問題を解決する方法が不思議です。また、ちょうど[0, 0, 0, 0]がある理由を知りたいですか?

回答に感謝します!

+0

スライスを使用すると、BUFへの書き込みを試みた、基礎となる配列を共有しますbuf [4:]など? –

+0

@FranckJeannin、私は多くのことを試しました...私は今それを試してみましょう。 –

+0

@FranckJeannin、まあまあです!私は間違いを見つけました。私は、バイトではないビットに関するインデックスを渡すべきだと思ったので、 'buf [32:]'は 'buf [4:]'ではありませんでした。ありがとうございました!私はそれを受け入れる答えとしてあなたのコメントを入れてください;) –

答えて

0

スライスが元の配列を共有するには、BUFに(PutUint32)を書くことができる[4]、BUF [8]、[2]等

関連する問題