0

私はデータ ネットワーク クラスのプロジェクトに取り組んでおり、次のようなヘッダーを連結するように求められます。

struct ip
{
    unsigned long a;
    unsigned long b;
    unsigned int l;
} IP;

そして、それが char* であるメッセージは、「こんにちは」と言ってみましょう。

したがって、このメソッドを使用して、これら 2 つを 1 つの char* に連結します。

memcpy(sendBuf, (void*)&sendHeader, sizeof(sendHeader));
memcpy(&sendBuf[sizeof(sendHeader)], readMessage, lengthMessage);

lengthMessage はメッセージの文字数 +1 で、これはヌル終了文字です。

したがって、sendBuf は次のように定義されます。

char sendBuf[BUFLEN + 1]   // BUF_LEN = 128

そして、この char* を次のように定義されたキューに入れます。

concurrency::concurrent_queue<char*> IP_in_queue;

それで、情報が正しいかどうかを確認したいので、すべてを確認します。

char* s;
IP_in_queue.try_pop(s);
numbytes = sizeof(s);
// Copy from buf to the header
memcpy( (void*)&readHeader, s, sizeof( IP_PACKET_HEADER_T));
// Copy message part
memcpy( sendedString, &s[sizeof(IP_PACKET_HEADER_T)], numbytes - sizeof(IP_PACKET_HEADER_T));
// Append \0 to the end
sendedString[numbytes - sizeof(IP_PACKET_HEADER_T)] = '\0';

したがって、char* をキューに入れる前に、sendBuf のサイズが 129 であることはわかっていますが、キューから取り出した後にバイト数を確認すると、バイト数の値は 4 であり、あまりにも異なっています。情報を正しく取得するため、理解できません。重要なものをいくつか見逃している可能性がありますが、変数 numbytes は少なくともそれ以上であるべきではありませんか?

私が自分自身を明確にしたことを願っています。誰かがこれをもう少しうまく説明できるかもしれません。

ありがとう

4

1 に答える 1

1

sizeof文字列の長さはわかりませんchar*.32ビットマシンでは4バイトの type のサイズがわかります。必要strlenなのは、文字列のバイト数です。

しかし、それはあなたが望むものではありません。構造IPには null が含まれている可能性があるためstrlen、正しい答えが得られません。文字列を最後ではなく最初に配置すると、それを修正できますが、私はそのようなハックを考えます. メッセージの先頭にサイズを明示的に追加する必要があります。

于 2012-09-19T03:09:30.120 に答える