「これをどのように解析する必要があるか」という質問は、データをどのように解析するかによって大きく異なります。あなたの質問には2つのことが欠けています:
- 正確にどのようにデータを受け取りますか?あなたはBluetoothについて言及していますが、プログラミング媒体は何ですか?ソケットから読んでいますか?他の種類のAPIはありますか?一度にバイト単位で受信しますか、それともブロック単位で受信しますか?
- 受け取ったデータを処理するためのルールは何ですか?ほとんどのデータは、何らかの方法で、または固定フィールド長で区切られています。あなたの場合、それはどんな長さでもよいとあなたは言います、しかしあなたがそれをどのように解析したいかを説明しない限り、私は助けることができません。
私が行う1つの提案は、使用するバッファーのタイプを変更することstd::vector
です。
std::vector<unsigned char> buffer(normalSize)
normalSize
着信メッセージの最も頻繁に観察されるサイズに近いものを選択する必要があります。ベクトルはアイテムをプッシュするにつれて大きくなるため、作成した配列とは異なり、大きなメッセージを受け取った場合にバッファオーバーランを心配する必要はありません。ただし、カバーの下で上に行くnormalSize
と、ベクトルは拡張要件に対処するのに十分なメモリを再割り当てします。これは高額になる可能性があるため、あまり頻繁に実行したくない場合があります。
配列とほぼ同じ方法でベクトルを使用します。主な違いの1つは、実行中のポインターを保持する必要がなく、単純に要素をベクトルの最後にプッシュできることです。したがって、Bluetoothソースから一度に1つの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であるかどうかに関係なく、配列がベクトルのサイズを自動的に変更することです。