0

現在UDPソケットで作業していますが、次の状況を理解しようとして立ち往生しています。

受信バッファは次のように定義されています。

char buf[1024];
...
memset(&buf, 0, sizeof(buf));

& は recvfrom() を呼び出すことで満たされます

size = recvfrom(sockdf, buf, sizeof(buf), MSG_WAITALL, (struct sockaddr *) &rx, (socklen_t *)&len);

Wireshark を使用して確認したリモートからこれらのデータを取得しています。

01 fe 00 04 00 00 00 21 53 53 53 5f 54 54 54 54 5f 30 31 32 33 34 35 36 37 10 fe 00 10 02 ac ca fe 00 00 00 00 00 00 00 00

単純なforループを使用してバッファの内容を特定すると、次のようになります。

for (i = 0; i < size; i++)
{
    printf("buf[%d] = 0x%x", i, buf[i]);
}

buf[0] = 0x1
buf[1] = 0xfffffffe
buf[2] = 0x0
buf[3] = 0x4
buf[4] = 0x0
buf[5] = 0x0
buf[6] = 0x0
buf[7] = 0x21
buf[8] = 0x53
buf[9] = 0x53
buf[10] = 0x53
buf[11] = 0x5f
buf[12] = 0x54
buf[13] = 0x54
buf[14] = 0x54
buf[15] = 0x54
buf[16] = 0x5f
buf[17] = 0x30
buf[18] = 0x31
buf[19] = 0x32
buf[20] = 0x33
buf[21] = 0x34
buf[22] = 0x35
buf[23] = 0x36
buf[24] = 0x37
buf[25] = 0x10
buf[26] = 0xfffffffe
buf[27] = 0x0
buf[28] = 0x10
buf[29] = 0x2
buf[30] = 0xffffffac
buf[31] = 0xffffffca
buf[32] = 0xfffffffe
buf[33] = 0x0
buf[34] = 0x0
buf[35] = 0x0
buf[36] = 0x0
buf[37] = 0x0
buf[38] = 0x0
buf[39] = 0x0
buf[40] = 0x0

確かに、受信したメッセージを取得/解析しようとして何か誤解していましたが、 buf[1]、buf[26]、buf[30]、buf[31]、および buf[32] を印刷すると余分な FF が返される理由を説明できません。

gdb を使用した場合と同じ動作

(gdb) p/x buf[26]
$3 = 0xfe
(gdb) call printf("0x%x\n", buf[26])        
0xfffffffe
$4 = 11

ヒントをいただければ幸いです。

4

1 に答える 1

6

これは符号拡張と呼ばれ、より小さい符号付きの値int昇格された場合に発生します(たとえば、 eg の引数として使用された場合printf)。

これを回避する簡単な方法の 1 つは、配列の代わりにunsigned char(または) を使用することです。uint8_tchar

uint8_t buf[1024];

または、hhプレフィックスを次のprintf形式で使用します。

printf("buf[%d] = 0x%hhx", i, buf[i]);
于 2020-02-24T13:28:16.440 に答える