0

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 にキャストしています。

値が正しくキャストされていないという私の結論は正しいですか? もしそうなら、どうすればこれを解決できますか?

前もって感謝します。

4

3 に答える 3

2

小さな (uint8_t) 変数に割り当てられている値は、「6」のように表示される印刷可能な ASCII 文字コードではありません。代わりに、これはバイナリ値であり、ソース コードで '\006' をコーディングするのと同じです。データ転送プロトコルがバイナリ コード バイトで動作する場合は、おそらく問題ありません。受信プログラムは、1 バイト (char) を読み込む (uint8_t) のインスタンスで何を取得しますか? もちろん、(uint8_t) を使用すると、メッセージの合計の長さが 0 から 255 に制限されます (ただし、それはわかっています)。

于 2011-10-19T01:07:09.260 に答える
1

uint8_t通常、char型の typedef であり、それらは書式設定された出力用にオーバーロードされ、数値ではなく文字として出力されます。残念ながら、これは C++ 形式の I/O の醜い側面の 1 つです。表示するには整数に変換する必要があります。

char c;
unsigned char u;

std::cout << (unsigned int)(unsigned char)(c) << std::endl
          << (unsigned int)(u) << std::endl;
于 2011-10-19T01:04:17.187 に答える
0

uint8_tunsigned charシステム内の であるため、それを出力すると、整数ではなく、値が 6 の文字として書き込まれます。

あなたのキャストに問題はありません。

于 2011-10-19T01:00:50.207 に答える