error-handling - 如何在 F# 中正确读取带有帧边界的字节流并进行错误处理?

标签 error-handling io f#

我是 F# 新手,需要帮助来解决此问题。

我有一个字节流,它来自串行端口并在 F# 中表示为序列。流由帧组成,每个帧以 0xFE 开始,以 0xFF 结束。连续传输字节,为了同步,我必须跳过一些字节直到 0xFE。但流可能已损坏并且可能缺少 0xFE 或 0xFF。

我有一个通过串行端口的输入进行迭代的函数。函数代码为:

let getFrame s =
    let r = s |> Seq.skipWhile (fun x->x<>0xFEuy) 
              |> Seq.takeWhile (fun x->x<>0xFFuy)
    if Seq.isEmpty r then r else Seq.skip 1 r

如何重写此代码以跳过字节直到 0xFE 或跳过一定数量的字节,如果没有发生 0xFE,则以功能方式返回错误?

对于取帧字节直到 0xFF 也是如此。

最佳答案

您可以使用Option<'T>键入作为函数的结果,其中 Some x意味着从输入序列中捕获了一些帧,并且 None没有找到帧数据:

let getFrame s =
    let r = s |> Seq.skipWhile ((<>) 0xFEuy) 
              |> Seq.takeWhile ((<>) 0xFFuy)
    if Seq.isEmpty r then None
    else Some (Seq.skip 1 r)

但是,正确的故障处理实现取决于 getFrame 的语义功能。例如,如果 0xFE 会怎样?存在,但没有 0xFF ?这是否意味着这不是一个数据框?这是否意味着数据帧被分割成多个序列?等等

关于error-handling - 如何在 F# 中正确读取带有帧边界的字节流并进行错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18273647/

相关文章:

c# - 检查SQL成功

java - InputStream 的 available() 趋于停止

debugging - F# 调试。 CLR

f# - F# 和 OCaml 等函数式语言中的 "let"关键字有什么用?

jquery - 使用jQuery : error-handler always called预加载图像

f# - 使用 FSyacc 解析期间的有意义的错误

javascript - Javascript 中 'nested' try/catch 语句的困惑

c++ - 如何从 Qt 中的大文件异步加载数据?

c - 将相同的文本添加到 C 文件中每一行的末尾

sqlite - 使用 SQLProvider 和 SQLite 的 ResolutionPath 问题