2016-05-07 5 views
-1

После проверки this вопрос я не нашел искомое решение, поэтому я попытался использовать strtol в следующем порядке:strtol результат несовпадения в то время как преобразование строки

in = (unsigned char *)malloc(16); 

for(size_t i = 0; i < (size_t)strlen(argv[2])/2; i+=2) 
{ 
    long tmp = 0; 
    tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16); 
    memcpy(&in[i], &tmp, 1); 
} 

Этот код производится несколько промежуточных значений:

Watches of local variables

Может кто-то пожалуйста, объясните мне, почему весь in массив заполняется по 0xFF (255) байт и почему tmp не равна это оценочная стоимость?

Подсказки о том, как улучшить код выше для заполнения in массив с правильными шестнадцатеричными значениями, также приветствуются.

+0

Вы должны прочитать [ask] – Amit

+1

Избавьтесь от отливок. '(unsigned char *)' не требуется. '(size_t)' не нужно, поскольку возвращаемый тип 'strlen()' уже есть 'size_t'. И '(const char *) argv [2] + i, & argv [2] + 2' просто неверно. – cremno

+0

Второй аргумент для 'strtol' совершенно неправильный - ничего не связано с входной строкой. И я предлагаю, чтобы ваш цикл должен был быть «strlen (...) 'not' strlen (...)/2', если вы пытаетесь попытаться преобразовать входную строку несколько раз, пропустив первую пару, следующую пару и т. д. шестнадцатеричных цифр. –

ответ

1

Ваш код является ошибочным для нескольких графов и слепков скрыть проблемы:

Кастинг возвращаемое значение 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); 
} 

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

Как написано, ваш код не имеет большого смысла, попытка интерпретировать его поведение бессмысленно.

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

 Смежные вопросы

  • Нет связанных вопросов^_^