LINUX.ORG.RU

Непонятки в выравнивании полей snprintf(Си)


0

0

Есть функция:

char *str2hex(char *str){ char *temp; int i, size = 4; for(i=0;str[i] != '\0';i++){ snprintf(temp, size, "%04x", str[i]); printf(temp); } }

Она должна переводить переданную строку в hex.

Вывод её работы(строка Hello): 004006006006006

а по задумке должно быть 00480065006c006c006f

Почему обрезается последний символ?

Пробовал формат "%03x", так теперь последний символ не обрезается, но само собой впереди только один ноль.

anonymous

Почему размер temp предолагается 4?
Переменная size должна быть типа size_t, не int.
Последний символ snprintf затирает '\0', конец строки.
Попробуй 5 вместо 4 (только temp должон быть массивом temp[5]).

Зачем вообще для такого использовать snprintf?
Может использовать что-то типа:

static inline void
chr_to_hex(char p_chr, char* p_buf)
{
    static const char   xlat[16] = {
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
    };

    p_buf[0] =
    p_buf[1] = '0';
    p_buf[2] = xlat[(int)(p_chr >> 0x4) & 0xf];
    p_buf[3] = xlat[(int)(p_chr  & 0xf)];
}

char*
str_to_hex(const char* p_input, char* p_buf, size_t p_bufsz)
{
    char*   output = p_buf;

    for(; *p_input != '\0' && p_bufsz > 3; ++p_input,
        p_buf += 4, p_bufsz -= 4)
    {
        chr_to_hex(*p_input, p_buf);
    };

    if(p_bufsz > 0){
        *p_buf = '\0';
    } else {
        output = NULL;
    };

    return output;
}

binnehex
()
Ответ на: комментарий от anonymous

> Я уже пробовал size менять на 5. При этом вылетает Segmentation fault

char temp[5];

binnehex
()
Ответ на: комментарий от Reset

Всем спасибо. Понял свою ошибку

anonymous
()

Мухаха! Ребяты, так нельзя.. :D

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.