“我应该如何解析这个”的问题很大程度上取决于您想要如何解析数据。您的问题缺少两件事:
- 您究竟是如何接收数据的?你提到蓝牙,但什么是编程媒介?你是从套接字读取的吗?你有其他类型的API吗?您是一次接收一个字节还是分块接收它?
- 处理您收到的数据的规则是什么?大多数数据以某种方式或固定字段长度分隔。在您的情况下,您提到它可以是任意长度,但除非您解释要如何解析它,否则我无能为力。
我会提出的一个建议是更改要使用的缓冲区类型std::vector
:
std::vector<unsigned char> buffer(normalSize)
您应该选择normalSize
在收到消息的最常观察到的大小附近。向量会随着您将项目推送到其上而增长,因此,与您创建的数组不同,如果您收到一条大消息,您无需担心缓冲区溢出。但是,如果您确实超出normalSize
了封面,则向量将重新分配足够的内存来应对您的扩展需求。这可能很昂贵,因此您不想经常这样做。
您使用向量的方式与数组的使用方式几乎相同。一个关键的区别是您可以简单地将元素推到向量的末尾,而不必保留一个正在运行的指针。所以想象你一次从蓝牙源收到一个 int,你的代码可能看起来像这样:
// Clear out the previous contents of the buffer.
buffer.clear();
int elem(0);
// Find the start of your message. Throw away elements
// that we don't need.
while ( 0x43 != ( elem = getNextBluetoothInt() ) );
// Push elements of the message into the buffer until
// we hit the end.
while ( 0x0D != elem )
{
buffer.push_back( elem );
}
buffer.push_back( elem ); // Remember to add on the last one.
关键的好处是,无论推送的字符数是 10 还是 10,000,数组都会自动调整向量的大小,而无需您这样做。