Неожиданное поведение при разборе сообщения recvfrom () из UDP-сокета - PullRequest
0 голосов
/ 24 февраля 2020

В настоящее время работаю с сокетом 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 l oop для идентификации содержимого буфера, я получаю:

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

Любые советы будут оценены.

1 Ответ

6 голосов
/ 24 февраля 2020

Это называется расширение знака и происходит, когда знаковые значения, меньшие int, повышаются (например, когда используются в качестве аргумента, например, printf) .

Один простой способ избежать этого - использовать unsigned char (или uint8_t) вместо char для массива:

uint8_t buf[1024];

Или с помощью hh префикс в формате printf:

printf("buf[%d] = 0x%hhx", i, buf[i]);
...