为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕哥6287543 2023-05-08 15:50:50
我正在使用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}有什么办法可以用换行符来获得长度吗?或者获取扫描仪停止时使用的令牌长度?
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

SplitFunc提供给的默认值bufio.NewScanner包括SplitLines一个调用dropCR,根据注释,该调用在行尾匹配\r?\n。因为Scanner会选择性地查找和删除回车符,所以您将无法使用bufio.Scanner.

根据我的经验,在基本情况下使用 Scanner 是很常见的,因为它是一个方便的结构。否则 bufio.Reader 提供了更大的灵活性。bufio.Reader#ReadBytes(delim byte)会给你你正在寻找的东西。


查看完整回答
反对 回复 2023-05-08
?
精慕HU

TA贡献1845条经验 获得超8个赞

虽然这是一个答案,从字面意义上回答了我关于包括\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

}


查看完整回答
反对 回复 2023-05-08
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信