Почему мой Char * пуст после заполнения целыми числами? - PullRequest
0 голосов
/ 16 июня 2020

Я хотел бы сохранить несколько целых чисел в указателе char, а затем отправить этот указатель с помощью sendto (winsock2). К сожалению, мой указатель на char всегда содержит только «\ n». Сразу при создании, а также после заполнения. Что я сделал не так?

uint32_t id = getID();
uint8_t inputType = getInputType(), inputValue = getInputValue();
char* inputBuffer = new char[6];
inputBuffer[0] = (id >> 24) & 0x000000ff;
inputBuffer[1] = (id >> 16) & 0x000000ff;
inputBuffer[2] = (id >> 8) & 0x000000ff;
inputBuffer[3] = (id >> 0) & 0x000000ff;
inputBuffer[4] = (inputType >> 0) & 0x000000ff;
inputBuffer[5] = (inputValue >> 0) & 0x000000ff;

// Send to Server
sendto(socket, inputBuffer, 6, 0, (SOCKADDR*)&srvAddr_In, sizeof(SOCKADDR));

delete[] inputBuffer;

id, inputType и inputValue всегда содержат допустимое число. Например, я пробовал id = 10, inputType = 4 и inputValue = 6

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Указатель на ваш char не содержит '\n', по крайней мере, не в первой позиции. Скорее, он содержит NUL в качестве первого элемента, поэтому он будет казаться пустым при отображении в виде строки в стиле C.

Это потому, что 8 младших битов, полученные с & 0xff, из 10 24-кратный сдвиг вправо равен нулю.

В буфере char есть данные. Обратите внимание, в частности, что inputBuffer[3] имеет значение 10. Просто вы не можете увидеть его в любимой программе просмотра строк!

Наконец, рассмотрите возможность использования unsigned char вместо char в качестве подписи char зависит от платформы. (И то же самое с дополнительной схемой char, если signed до C ++ 14).

0 голосов
/ 16 июня 2020

Давайте рассмотрим шаг за шагом, что не так:

Предположим,

uint32_t id = 100

Битовое представление идентификатора будет:

00000000 00000000 00000000 01100100

Шаг 1.

Заявление: inputBuffer[0] = (id >> 24) & 0x000000ff;
Фактически вы можете просто упростить это до: (id >> 24)

Результат: inputBuffer[0] = 00000000

Шаг 2.

Заявление: inputBuffer[0] = (id >> 16) & 0x000000ff;

Результат: inputBuffer[1] = 00000000

Шаг 3.

Заявление: inputBuffer[0] = (id >> 8) & 0x000000ff;

Результат: inputBuffer[2] = 00000000

Шаг 4.

Заявление: inputBuffer[0] = (id >> 0) & 0x000000ff;

Результат: inputBuffer[3] = 01100100 // 100

Если вы попытаетесь напечатать inputBuffer на этом этапе, он не будет ничего печатать, так как первая позиция содержит \0. Это прекрасно. Вам просто нужно быть осторожным с получателем сообщения.

Получатель:

uint32_t id = (uint32_t)data[0] << 24)  |
              ((uint32_t)data[1] << 16) |
              ((uint32_t)data[2] << 8)  |
              ((uint32_t)data[3]);
//id == 100
...