が、これは擬似コードであることに注意してくださいと私は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はどのように知っていますか?
binary.Readは、 'data'引数を埋めるために必要なデータのサイズを正確に読み取ります。だから、それは 'uint32'のためにちょうど4バイトを読み込み停止します。 – JimB
'klen'には' p.buffer'から読み込んだ4バイト(uint32)の値がビッグエンディアンとして解釈されます。読み取られたバイト数は割り当てられません。 – thwd
@jimBこれは、klen> maxKeyLenの条件が真ではないことを意味します。なぜなら、klenは最大で4バイトなのですから? –