亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用掃描儀時如何獲取包括換行符在內的行長?

使用掃描儀時如何獲取包括換行符在內的行長?

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 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號