Bitte beachten Sie, dieser Pseudo-Code ist, und ich bin summarising.I ist etwas Quellcode aus dem Innern einer Funktion zu lesen:Wie weiß diese binary.read, wann sie aufhören soll?
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)
}
An welchem Punkt hört die binary.Read? Denn gerade danach gibt es eine andere Lese:
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)
}
Wo p.buffer über definiert:.
buff := new(bytes.Buffer)
io.Copy(buff, r)
p.buffer = buff
und r einige Daten, die übergeben wurde
Zuerst dachte ich, Die Antwort war bei 4 Bytes, es stoppt. Aber das ist nicht wahr, weil das Maxkeylen nach mehr als das sucht. Wie also weiß die binary.read wann zu stoppen, da mehr Daten voraus sind, weil die nächste für den vlen gelesene binäre dann Sachen findet?
binary.Read liest genau die Größe der Daten, die benötigt werden, um das Argument 'data' zu füllen. Also ja, es liest genau 4 Bytes für ein 'uint32' und stoppt. – JimB
'klen' wird den Wert von 4 Bytes (uint32) zugewiesen, gelesen von' p.buffer', interpretiert als Big-Endian. Es wird nicht die Anzahl der gelesenen Bytes zugewiesen. – thwd
@jimB Bist du sicher, weil das bedeuten würde, dass die Bedingung klen> maxKeyLen niemals wahr wäre, weil klen höchstens 4 Bytes hat? –