Усеченное значение сохраняется - PullRequest
0 голосов
/ 29 апреля 2018

Вот мой буфер, и любой может объяснить, как я могу сохранить шестнадцатеричное значение внутри него, и когда я пытаюсь напечатать buffer[0], он печатает 0 вместо 500. Я пытаюсь заполнить элемент буфера с помощью идентификатор, который имеет 11 бит, я знаю, что символ имеет 1 байт, т.е. 8 бит, и он не может хранить значение. у меня есть другие элементы для заполнения в буфер, и они имеют тип char. Поэтому я не могу изменить тип буфера с char на int. Как я могу решить мою проблему.

char *buffer;
buffer = (char *)malloc(10*(sizeof(frameRd)));      //frameRd is of 16bytes
buffer[0] = frameRd->id;
for(int i =1;i<15;i++)
{
  buffer[i] = frameRd->data;
}
for(int i =0,i<16;i++)
{
 printf("%4X",buffer[i]);
}

где frame->id = 0x500;, когда я печатаю это значение на консоли, он печатает buffer[0] как 0 и, конечно, потому что

1 Ответ

0 голосов
/ 29 апреля 2018

Поскольку buffer равно char*, buffer[0] равно char. Поэтому присвоение

buffer[0] = frameRd->id;

означает «усечь frameRd->id до char и сохранить результат в buffer[0]», то есть именно тот эффект, который вы наблюдаете. Более того, когда вы печатаете buffer[0] с %4X, вы печатаете только значение buffer[0], преобразованное в int.

Если вы хотите получить int или целое struct в буфер char[], используйте memcpy:

// Do not cast results of malloc
buffer = malloc(10*(sizeof(frameRd)));
// Save id into the buffer at index 0
memcpy(&buffer[0], &frameRd->id, sizeof(frameRd->id));
// Pull id back
int tmpId;
memcpy(&tmpId, &buffer[0], sizeof(tmpId));
printf("%04x\n", tmpId);

Демо-версия.

...