基于C++我收到几组uint8_t的数据但是我无法判断每一帧,帧头是eb 90,这一帧结束标志是下一帧的帧头,我怎么通过代码将他们分割出来,附完整版代码
时间: 2024-09-27 16:10:57 浏览: 29
在C++中,如果你接收到一组以`eb 90`开始和下一个帧的`eb 90`结束的`uint8_t`数据流,你可以使用循环和条件检查来逐字节解析并分割每个帧。下面是一个基本的示例代码,假设`data`是包含整个数据的`std::vector<uint8_t>`:
```cpp
#include <vector>
#include <iostream>
bool isFrameStart(uint8_t byte) {
return byte == 0xeb && (byte + 1) == 0x90;
}
std::vector<std::vector<uint8_t>> splitFrames(const std::vector<uint8_t>& data) {
std::vector<std::vector<uint8_t>> frames;
uint8_t frameData[256]; // 你可以根据实际需要调整这个大小
size_t frameIndex = 0;
for (size_t i = 0; i < data.size(); ++i) {
if (isFrameStart(data[i])) {
// 如果找到帧开始,保存到frameData,并开始新的一帧
if (frameIndex > 0) {
frames.push_back(std::vector<uint8_t>(frameData, frameData + frameIndex));
}
frameIndex = 0;
frameData[frameIndex++] = data[i]; // 添加帧头
} else {
frameData[frameIndex++] = data[i]; // 非帧头数据都添加到当前帧
}
// 当遇到下一个帧的帧头时,跳出循环,因为下一个帧会开始一个新的处理过程
if (i + 1 >= data.size() && isFrameStart(data[i + 1])) {
break;
}
}
// 检查是否有未结束的帧
if (frameIndex > 0) {
frames.push_back(std::vector<uint8_t>(frameData, frameData + frameIndex));
}
return frames;
}
int main() {
std::vector<uint8_t> raw_data = { /* your actual data bytes here */ };
auto frames = splitFrames(raw_data);
for (const auto& frame : frames) {
std::cout << "Frame: ";
for (auto byte : frame) {
std::cout << byte << ' ';
}
std::cout << '\n';
}
return 0;
}
```
这段代码首先定义了一个函数`isFrameStart`用于判断是否是帧开始,然后在`splitFrames`函数中遍历数据,当找到帧开始就创建新的帧,直到遇到下一个帧开始或者遍历完所有数据。
阅读全文