0

私はCプログラミングが初めてで、次のようにフォーマットされたUDPパケットを受信して​​処理するコードをテストしています:

UINT16 port1
UINT16 port2

このテストで対応する値は次のとおりです。

6005
5555

パケット バッファ全体を出力すると、次のようになります。

u^W³^U><9e>^D

どうすればそれを壊して正しい値を得ることができますか? 関数を試してみましuint16_tたが、うまくいきませんでした。数字が間違っているだけです。次のようなことを試しています。unsigned shorthtons

int l = 0;
unsigned short *primaryPort = *(unsigned short*) &buffer[l]; 
AddToLog(logInfo, "PrimaryPort: %u\n", primaryPort);
l += sizeof(*primaryPort);
unsigned short *secondaryPort = *(unsigned short *) &buffer[l]; 
AddToLog(logInfo, "SecondaryPort: %u\n", secondaryPort);
l += sizeof(*secondaryPort);

これらの値を取得するための正しい方法または最良の方法は何ですか? これらの 2 つの uint16 値は整数形式ではないと思いuint16ます。この文字の単なる char テキストだと思うu^W³^U><9e>^Dので、整数のように処理しているため、おそらく間違った数値を取得しています。しかし、私はすべてを試しましたが、正しい値を取得できません。

4

1 に答える 1

0

受け取ったバッファを見ると、実際には 6005 (リトル エンディアン) で始まっています。

6005 は 0x1775 で、最初の 2 文字はu(0x75) とCtrl-W(0x17) です。したがって、次の方法で int 値を取得する必要があります。

 unsigned short primaryPort = (buffer[l] & 0xff) | ((buffer[l+1] & 0xff) << 8 );

セカンダリ ポートについても同様です。

編集

次の理由で機能します。

のような式ではbuffer[l] & 0xffbuffer[i]は暗黙的に にキャストされますint(詳細については、「整数昇格」を検索してください)。0xff次の場合は、次のようにマスクする必要bufferがありchar *ます。buffer[i]符号付きのchar であるため、最上位ビットが設定されている場合、その値は負になります (たとえば'\xff'、-1 です)。マスクすることで、代わりに 0 ~ 255 の範囲の正の値を取得できるようになります。最後になりましたが、シフト演算子<< 8は、バイト値を、計算された次の上位バイトにシフトしますint。最後に、計算結果が 0xffff 以下でunsigned shortあるため、完全な操作の結果が暗黙的にキャストされ、安全に実行できます。int

于 2013-10-15T12:49:18.703 に答える