Ваш код является ошибочным для нескольких графов и слепков скрыть проблемы:
Кастинг возвращаемое значение malloc
не является необходимым в C и потенциально могут скрыть опасное преобразование, если вы забудете включить <stdlib.h>
:
in = (unsigned char *)malloc(16);
Casting возвращаемого значения strlen
к (size_t)
бесполезно, даже избыточные, как определено strlen
вернуть size_t
. Опять вы, возможно, забыли включить <string.h>
...
for (size_t i = 0; i < (size_t)strlen(argv[2])/2; i += 2) {
long tmp = 0;
strtol
принимает константный указатель на char
, который argv[2] + i
будет конвертировать в неявном виде. Листинг (const char*)
бесполезен. Второй аргумент - адрес char*
. Вы передаете адрес пятого элемента argv
, в других терминах &argv[4]
, безусловно, не то, что вы отступ делать, хотя цель вашего цикла является весьма неясной ...
tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16);
Копирования длинного значения в tmp
с memcpy
потребуется скопировать sizeof(tmp)
байт. Копирование первый байт только определил реализация эффекта, в зависимости от размера char
и порядок байтов целевой системы:
memcpy(&in[i], &tmp, 1);
}
Вы должны опубликовать полный компилируемый пример, иллюстрирующий проблему, фрагмент кода отсутствует важная контекстная информация, например, какие файлы заголовков включены, как определяются переменные и какой код выполняется перед фрагментом.
Как написано, ваш код не имеет большого смысла, попытка интерпретировать его поведение бессмысленно.
Что касается вопроса в ссылке, ваш код даже не позволяет удаленно предоставить решение для преобразования строки шестнадцатеричных символов в массив байтов.
Вы должны прочитать [ask] – Amit
Избавьтесь от отливок. '(unsigned char *)' не требуется. '(size_t)' не нужно, поскольку возвращаемый тип 'strlen()' уже есть 'size_t'. И '(const char *) argv [2] + i, & argv [2] + 2' просто неверно. – cremno
Второй аргумент для 'strtol' совершенно неправильный - ничего не связано с входной строкой. И я предлагаю, чтобы ваш цикл должен был быть «strlen (...) 'not' strlen (...)/2', если вы пытаетесь попытаться преобразовать входную строку несколько раз, пропустив первую пару, следующую пару и т. д. шестнадцатеричных цифр. –