gpt4 book ai didi

go - 这个 binary.read 如何知道何时停止?

转载 作者:IT王子 更新时间:2023-10-29 01:58:56 24 4
gpt4 key购买 nike

请注意这是伪代码,我正在总结。我正在从函数内部读取一些源代码:

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 在什么时候停止?因为在这之后还有另一个读物:

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)
}

其中 p.buffer 是通过以下方式定义的:

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

而r是已经传入的一些数据。

起初我以为答案是在 4 个字节处停止。但事实并非如此,因为 maxkeylen 检查的值大于此值。那么 binary.read 如何知道何时停止,因为前面有更多数据,因为 vlen 的下一个二进制读取然后找到了东西?

最佳答案

在质疑 Go 的 super 英雄时,请始终引用他们的实际源代码:

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

Read reads structured binary data from r into data. Data must be a pointer to a fixed-size value or a slice of fixed-size values. Bytes read from r are decoded using the specified byte order and written to successive fields of the data.

关于go - 这个 binary.read 如何知道何时停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36598964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com