gpt4 book ai didi

c - 尝试读取段错误,直到在 C 中遇到 header

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:17 25 4
gpt4 key购买 nike

我是 C 的新手,所以请原谅这个问题的简单性。我正在尝试编写一个函数(作为一个库,因此它必须是健壮的)不断读取一个字节(编辑:从串行端口)直到遇到 header 起始字节。如果找到它,它将读取 header 和有效负载的其余部分并将其存储在结构中。我的代码开头看起来像这样(将包含一些伪代码):

soh_read = 0;
bytes_read = 0;
bytes_left = 1;

do{
n = read(fd, buf + bytes_read, bytes_left);
if(n < 0){
if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR){
return -1;
}
}else{
bytes_read += n;
if(!soh_read){
if(buf[0] != SOH){
bytes_read = 0;
continue;
}
}
soh_read = 1;
//read header ...
//read payload ...

}while(timeout is not reached);

我假设如果没有遇到 SOH,我可以将 bytes_read 重置为 0,并尝试再次读取 buf[0] 位置,覆盖它之前读取的垃圾。但这似乎是缓冲区溢出的情况,为什么我会遇到段错误?为什么那行不通呢?如果是这样,最好的方法是什么?我想从 buf[0] 开始,这样可以很容易地跟踪每个消息字段。只是想向这里的专家学习,谢谢。

最佳答案

您遗漏了一些对诊断代码问题至关重要的信息。最重要的一件事情(可能)是您的 SOH 是否会在文件中出现的时间晚于您在 buf 中允许的空间。

不过,话虽如此,我认为我会采取完全不同的做法:既然您显然不需要(甚至不关心)SOH 之前的数据,为什么不将所有数据读入一个字符,在每次迭代时覆盖先前的值,并且在遇到 SOH 后仅保存多于一个字节的数据,因此您实际上可以使用它。

do { 
read(fd, buf, 1);
if (n<0 && errno != EWOULDBLOCK && /* ... */)
return -1;
} while (buf[0] != SOH and !timeout_reached);

// read the header here

关于c - 尝试读取段错误,直到在 C 中遇到 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553904/

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