请注意:
我已经实现了这些东西,只是不以任何方式通用或优雅。这个问题的动机是我想学习更多的 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 个解决方案:
- 检查校验和,将数据连接成一个只有数据字节的字符串,解码。
- 使用迭代器和一个讨厌的 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/