2016-04-13 9 views
1

が、これは擬似コードであることに注意してくださいと私はsummarising.Iは、関数内からいくつかのソースコードを読んでいます午前:このbinary.readはいつ停止するのですか?

maxKeyLen := 100 * 1024 * 1024 
maxValueLen := 100 * 1024 * 1024 
var klen, vlen uint32 
binary.Read(p.buffer, binary.BigEndian, &klen) 

if klen > maxKeyLen { 
    return nil, nil, fmt.Errorf("key exceeds max len %d, got %d bytes", maxKeyLen, klen) 
} 

どの時点でbinary.Readが停止していますか?

p.bufferを介して定義されて
key := make([]byte, klen) 
_, err := p.buffer.Read(key) 
if err != nil { 
    return nil, nil, err 
} 

binary.Read(p.buffer, binary.BigEndian, &vlen) 
if vlen > maxValueLen { 
    return nil, nil, fmt.Errorf("value exceeds max len %d, got %d bytes", maxValueLen, vlen) 
} 

buff := new(bytes.Buffer) 
io.Copy(buff, r) 
p.buffer = buff 

であり、Rは、私が思った最初は

に渡されたいくつかのデータです。ストレート、この後に別の読み出しがございますので、答えは4バイトで止まった。しかし、それはマックスケイレンがそれよりも大きいかどうかをチェックするので真実ではない。では、vlenの次のバイナリを読み込んでから何かを見つけるので、先にデータがあるので、いつ停止するのか、binary.readはどのように知っていますか?

+5

binary.Readは、 'data'引数を埋めるために必要なデータのサイズを正確に読み取ります。だから、それは 'uint32'のためにちょうど4バイトを読み込み停止します。 – JimB

+0

'klen'には' p.buffer'から読み込んだ4バイト(uint32)の値がビッグエンディアンとして解釈されます。読み取られたバイト数は割り当てられません。 – thwd

+0

@jimBこれは、klen> maxKeyLenの条件が真ではないことを意味します。なぜなら、klenは最大で4バイトなのですから? –

答えて

3

行くのスーパーヒーローに疑問を、常に問題となっている彼らの実際のソースコードを参照してください。

https://golang.org/src/encoding/binary/binary.go?s=4201:4264#L132

142 func Read(r io.Reader, order ByteOrder, data interface{}) error { 
143  // Fast path for basic types and slices. 
144  if n := intDataSize(data); n != 0 { 

ライン144が知っているタイプの初期サイズを読み取り、反復処理の一例を示していますか、必要に応じて後でその範囲でコピーします。

上記のコード例では、klenの4バイトの長さはuint32です。つまり、p.bufferから4バイトをklenに読み込みます。

それはマニュアルにヒントを与えます:

https://golang.org/pkg/encoding/binary/#Read

func Read(r io.Reader, order ByteOrder, data interface{}) error 

読むには、データにrから構造化されたバイナリデータを読み込みます。データは、固定サイズの値へのポインタまたは固定サイズの値のスライスでなければなりません。 rから読み出されたバイトは、指定されたバイトオーダを使用してデコードされ、データの連続するフィールドに書き込まれます。

+0

Read関数はp.bufferの "固定サイズ"をチェックしていないので、 'data'の型のサイズをチェックしています。 'r'引数は単なる' io.Reader'であり、サイズは必要ありません。 – JimB

+0

ああ。ウルの権利。それは私がモバイルで応答し、あまりにも速く読むために得るものです。更新しました。 – eduncan911

関連する問題