boost::asio のソケットを使用して一方の端 (クライアント) からもう一方の端 (サーバー) にメッセージを送信するコードを作成しようとしています。
現在の私の特定の目標は、送信されるすべてのメッセージの先頭に 1 バイトの符号なし整数 (uint8_t) を追加して、残りのメッセージの長さを受信者に伝えることです。
サイズを size_t ではなく uint8_t として格納および転送する理由は、両方のマシンで正確に 1 バイトになるようにしたいためです。少しグーグルで調べたところ、マシン A とマシン B では size_t のサイズが異なる可能性があり、混乱する可能性があることがわかりました。
ここで、メッセージの長さを計算しています。メッセージは 2 つの部分だけで構成されています: uint16_t の後に変数 "data" が続きます。これは (void*) キャスト メモリのチャンクであり、さまざまな目的に使用されます (ターゲット マシンにはそのデータを解釈する方法がありますが、私はそうしません)。ここではそれに入りません)。
uint8_t sizeOfMessage = sizeof(uint16_t) + sizeof(data);
この例では、sizeof(data) == 4 であるため、sizeOfMessage は 6 に等しい必要があります (uint16_t は 2 バイトの整数であるため)。ただし、std::cout << sizeOfMessage の場合、表示されるのは 6 ではなく、特殊文字であるスペード (トランプのスーツのように) です。VS2010 のデバッガーでデータを見ると、6 '-'と表示されます。ただし、sizeOfMessage を size_t として定義して出力すると、すべて問題ありません (ただし、size_t のバイト単位のサイズはマシン間で保証されていないため、ネットワーク経由で送信することはできません)。
これは、演算後に size_t が uint8_t にキャストされる方法に問題があることを意味します。 sizeofは size_t を返すので、私のコードは 2 つの size_t を追加してから、それを uint8_t にキャストしています。
値が正しくキャストされていないという私の結論は正しいですか? もしそうなら、どうすればこれを解決できますか?
前もって感謝します。