gpt4 book ai didi

arrays - [] byte {10}或[] byte(“\n”)与[] byte {92,110}

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:02 29 4
gpt4 key购买 nike

我正在使用github.com/tarm/serial来连接一些串行仪器。在开发过程中,我使用/dev/ttyp0/dev/ptyp0对,其中go进程连接到一个,我使用screen连接到另一个。我编写了一个函数,它与serial.Config.ReadTimeout结合起来,最多可以读取ReadTimeout或接收到给定的字节序列。该功能是:

func readToTermination(s serial.Port, termination []byte, rate time.Duration) []byte {
var out []byte
lterm := len(termination)
for {
buf := make([]byte, 128)
n, _ := s.Read(buf)
out = append(out, buf[:n]...)
l := len(out)
if l >= lterm {
if bytes.Compare(out[l-lterm:], termination) == 0 {
break
}
}
time.Sleep(rate)
}
return out
}

这样就避免了CPU周期的消耗,而不需要去缓冲。当我使用 termination = []byte("\n")和screen进行测试时, break不会触发,因为它会变成 []byte{97, 11}(两个不同的元素,类似于每次按键后的屏幕刷新)。另一方面,如果我做了类似于 echo "foo" > /dev/ptyp0的事情,中断就会正确触发。echo似乎隐式地发送了一个 \n,或者关闭了连接。我看到 \r\n代表 echo foo\r\n\r\n代表 echo "foo\n"
所以我的问题是:
(1)为什么这里的行为有差异?
(2)我如何得到我的行为后,我真的与终止的马车返回?也许我应该用EOT代替?人类永远不会直接输入这个。

最佳答案

我认为值得一提的是使用bufio.Scanner的解决方案,

package main

import (
"bufio"
"bytes"
"fmt"
"strings"
)

func main() {
s := strings.NewReader("hello\n\ngolang")
termination := []byte("\n")

sc := bufio.NewScanner(s)
sc.Split(ScanTermination(termination))
for sc.Scan() {
fmt.Println(sc.Bytes(), string(sc.Bytes()), sc.Err())
}
}

func ScanTermination(term []byte) func(data []byte, atEOF bool) (advance int, token []byte, err error) {
return func(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 {
return 0, nil, nil
}

if i := bytes.Index(data, term); i >= 0 {
return i + 1, data[0:i], nil
}

if atEOF {
return len(data), data, nil
}
// Request more data.
return 0, nil, nil
}
}

输出
[104 101 108 108 111] hello <nil>
[] <nil>
[103 111 108 97 110 103] golang <nil>

关于arrays - [] byte {10}或[] byte(“\n”)与[] byte {92,110},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58073179/

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