猿问

使用扫描仪时如何获取包括换行符在内的行长?

我正在使用ScanIMAP 连接一次扫描第 1 行,这些连接应该以 结尾\r\n,但我怀疑我得到的一些行实际上只是以 结尾\n,因为我得到的数据量不正确在特定实例中解析主体原子时


(* 8620 FETCH (BODY[] {7060}这就是我在这封电子邮件中得到的正文内容,但如果将换行符计为 2 个字节,这似乎比计数要长)


// ...

r := bufio.NewScanner(d.conn)

for r.Scan() {

    line := r.Text()

    len(line) // gets the line length WITHOUT the newline

}

有什么办法可以用换行符来获得长度吗?或者获取扫描仪停止时使用的令牌长度?


慕哥6287543
浏览 109回答 2
2回答

汪汪一只猫

SplitFunc提供给的默认值bufio.NewScanner包括SplitLines一个调用dropCR,根据注释,该调用在行尾匹配\r?\n。因为Scanner会选择性地查找和删除回车符,所以您将无法使用bufio.Scanner.根据我的经验,在基本情况下使用 Scanner 是很常见的,因为它是一个方便的结构。否则 bufio.Reader 提供了更大的灵活性。bufio.Reader#ReadBytes(delim byte)会给你你正在寻找的东西。

精慕HU

虽然这是一个答案,从字面意义上回答了我关于包括\n和潜在的\r问题,但在阅读 IMAP 服务器的响应时首先使用 Scanner 并不是正确的工具,我将重写我对 Scanner 的使用并替换它与 bufio.Reader。您可以指定在扫描器中使用的自定义拆分函数,例如,您可以将 ScanLines 拆分函数移植到一个不会使用返回的令牌丢弃换行符的函数。// ...r := bufio.NewScanner(d.conn)r.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {    if atEOF && len(data) == 0 {        return 0, nil, nil    }    if i := bytes.IndexByte(data, '\n'); i >= 0 {        // We have a full newline-terminated line.        return i + 1, data[0 : i+1], nil    }    // If we're at EOF, we have a final, non-terminated line. Return it.    if atEOF {        return len(data), data, nil    }    // Request more data.    return 0, nil, nil})for r.Scan() {    line := r.Text()    len(line) // now gets the line length WITH the newline}
随时随地看视频慕课网APP

相关分类

Go
我要回答