C++ STL : a good way to parse a sensor response

标签 c++ parsing stl boost

请注意:

我已经实现了这些东西,只是不以任何方式通用或优雅。这个问题的动机是我想学习更多的 STL 技巧,而不是问题本身。

我认为这在我声明我已经解决了问题的方式中已经很清楚了,但是许多人本着最好的意图回答了问题的解决方案,而不是问题的答案 “如何以 STL 方式解决这个问题”。如果我以令人困惑的方式表达这个问题,我真的很抱歉。我讨厌浪费别人的时间。

好的,它来了:

我得到一个充满编码数据的字符串。

它来自: N >> 64 字节

  • 每 3 个字节被解码为一个 int 值
  • 在最多 64 个字节(是的,不能被 3 整除!)之后是一个字节作为校验和
  • 后跟一个换行符。
  • 如此继续下去。

当找到 2 个连续换行符时结束。

它看起来像是一种不错的或至少还可以的数据格式,但解析起来很优雅 STL 方式确实有点**。

我已经“手动”完成了这件事。

但如果有一种优雅的方式使用 STL- 或者 boost- 魔法不包含复制这件事,我会很感兴趣。

澄清: 有时它变得非常大。 N >> 64byte 更像是 N >>> 64 byte ;-)

更新 好的,N>64 字节似乎令人困惑。这并不重要。

  • 传感器将 M 个测量值作为整数。将它们中的每一个编码成 3 个字节。一个接一个地发过去
  • 当传感器发送了 64 字节的数据时,它会在 64 字节和一个 LF 上插入一个校验和。它不在乎其中一个编码整数是否被“分解”。它只是在下一行继续。(这只会使数据易于人类阅读,但难以优雅地解析。)
  • 如果它已完成发送数据,它会插入一个校验和字节和 LFLF

所以一个数据 block 可以看起来像这样,对于 N=129=43x3:

|<--64byte-data-->|1byte checksum|LF 
|<--64byte-data-->|1byte checksum|LF 
|<--1byte-data-->|1byte checksum|LF
LF

当我有 M=22 个测量值时,这意味着我有 N=66 字节的数据。 在 64 字节之后,它插入校验和和 LF 并继续。 这样它打破了我最后的测量 它以字节 64、65 和 66 编码。现在看起来像这样:64、校验和、LF、65、66。 由于 3 除以 64 的倍数在 3 次中有 2 次出现余数,并且每次 另一个,很难解析。 我有 2 个解决方案:

  1. 检查校验和,将数据连接成一个只有数据字节的字符串,解码。
  2. 使用迭代器和一个讨厌的 if 构造来避免复制。

我只是觉得可能会有更好的东西。我考虑过 std::transform,但它行不通,因为 3 字节是一个整数。

最佳答案

尽管我很喜欢 STL,但我认为手动执行操作没有任何问题,尤其是当问题并不真正属于 STL 所针对的情况时。再一次,我不确定你为什么问。也许您需要一个 STL 输入迭代器(检查并)丢弃校验和和 LF 字符并发出整数?

我假设编码是 LF 只能出现在那些地方,即某种 Base-64 或类似的地方?

关于C++ STL : a good way to parse a sensor response,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167518/

相关文章:

c++ - 填充 unordered_set 的更有效方法?

c++ - 覆盖析构函数 C++

python - 无法修复 pyparsing 错误...

java - 在 Java 中解析来自 String 的输入

java - 在类文件中查找对其他类的引用的简单方法

c++ - 列表迭代器不可递增

c++ - 避免进入 Visual Studio 2008 调试器中的 c++ std 头文件

c++ - WebP 编码 - 段错误

c++ - 单个语句中的多个复合赋值 : is it Undefined Behavior or not?

c++ - 在 while 循环条件 C++ 中使用时 std::cin 的行为