Префикс массива указателей без знака с двумя байтами 0x00 - PullRequest
0 голосов
/ 19 января 2020

Если, например, у меня есть unsigned char *str со значениями 0x68 0x65 0x6C 0x6C 0x6F, как я могу добавить к этому массиву два нулевых байта, чтобы массив стал [0x00 0x00] 0x68 0x65 0x6C 0x6C 0x6F ([] = добавленные байты)?

Я пробовал с strcat, но это не дает желаемого результата, я думаю, что 0x00 байтов обрабатываются как ограничители строки.

1 Ответ

1 голос
/ 19 января 2020

Функция strcat предназначена для обработки строк, то есть символьных массивов с нулевым символом в конце. Поскольку ваш массив не заканчивается на ноль, вы не должны использовать эту функцию.

Вместо этого вы можете использовать функции memmove и memset, если хотите избежать ручного кодирования движения. Однако вам нужно объявить массив str с подходящим (большим) размером (чтобы вместить добавленные байты). Так, например:

unsigned char str[7] = { 0x68, 0x65, 0x6C, 0x6C, 0x6F, }; // Note: size must be at least 7
//.. some code
memmove(str+2, str, 5); // Shift along by two bytes (see note, below)
memset(str, 0, 2);      // Add the two 'prefix' zeros

Обратите внимание, что функция memmove безопасна с перекрывающимися буферами (разметка):

Копирует значения количество байтов от местоположения, указанного источником, до блока памяти, указанного адресатом. Копирование происходит так, как если бы использовался промежуточный буфер, позволяя перекрывать место назначения и источник.

Однако это относится только к функции memmove, а не к функции memcpy. С функцией memcpy небезопасно иметь перекрывающиеся буферы.

Также обратите внимание, что unsigned char *str не объявляет массив (хотя вы можете использовать аналогичный синтаксис для строковых литералов ). Вам необходимо использовать (исправленную) версию опубликованного кода.

...