注:この質問は非常に複雑であると思います(願わくば、皆さんのためではないので、ここで質問しますlol)。できるだけ単純で明確に説明するように最善を尽くしました。
私のアプリケーションでは、固定サイズのバッファでバイト配列を継続的に受信しています。
私が受け取っているこれらの一連のバイト配列は、「バイナリ」でシリアル化されています。
ただし、受信したバイト配列が固定サイズのバッファーよりも大きくなることがあるため、現在受信しているバイト配列をコンテナーに格納し、受信した残りのバイト配列を受信するために再度ループする必要があります。
私の質問は、受け取ったバイト配列のすべての「バッチ」を「連結」、「結合」、または「結合」して、単一のバイト配列を形成する方法です(コンテナ、場合によってはバイト配列のキューに格納されます)。それらを逆シリアル化しますか?
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
// If the buffer was not filled, I have to get the number of bytes received as Thorsten Dittmar was saying, before queuing it
dataReceivedQueue.Enqueue(state.buffer);
// Get the rest of the data.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback_onQuery), state);
}
else
{
// All the data has arrived; put it in response.
response_onQueryHistory = ByteArrayToObject(functionThatCombinesBytes(dataReceivedQueue));
// Signal that all bytes have been received.
receiveDoneQuery.Set();
}
state.bufferは、データを受信するバッファーです。bufferはサイズ4096のバイト配列です。stateはStateObject型です。
ByteArrayToObject(byte [])は、受信したデータの逆シリアル化とオブジェクト形式への変換を処理します
functionThatCombinesBytes(Queue)この関数はバイトのキューを受け取り、すべてのバイトを1つのバイト配列に「結合」します