Консультация № 190557
13.02.2017, 11:35
0.00 руб.
13.02.2017, 11:36
0 8 1
Здравствуйте! Прошу помощи в следующем вопросе:
Чистый Си (ни в коем случае не С++ ).
Есть массив байт, содержащий в каждой ячейке число от 0 до 255 (тип unsigned char). Например, m[0]=11, m[1]=155, m[2]=250 и т.д. Как мне этот массив конвертировать в единую строку. Если взять пример выше, то должно получиться "0B9BFA". Вывод не на экран, а в переменную типа char *.

Обсуждение

давно
Посетитель
7438
7205
13.02.2017, 13:46
общий
13.02.2017, 14:10
Адресаты:
Легко! Хотя бы так:
Код:
char hex(char c)
{
c &= 0x0f;
return (c<10)?c+'0':c-10+'A';
}

int main()
{
unsigned char m[3] = {11,155,250};
char h[16];

int i;

for(i=0; i<3; i++)
{
h[i<<1] = hex(m[i]>>4);
h[(i<<1)+1] = hex(m[i]);
}
h[i<<1] = 0;
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
14.02.2017, 04:05
общий
Адресаты:
Круто! Большое гран мерси!
Сейчас делаю программку, которая должна считывать RFID карточки и передавать их номер в браузер, чтобы наш библиотечный читатель сразу открывал свою страничку. Долго рылся во всяких стандартных библ функциях си с целью найти какую-нибудь готовую функцию. Пытался приспособить sprintf() но что-то у меня не получилось ничего...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
312929
1973
14.02.2017, 04:38
общий
14.02.2017, 04:40
Адресаты:
Ещё один вариант - использовать функцию sprintf для вывода данных в строку в нужном формате:
Код:
int main()
{
const int N = 3;
unsigned char m[N] = {11,155,250};
char s[2*N+1];
int i;
for (i=0; i<N; i++) sprintf(s+2*i, "%02X", m[i]);
printf("%s", h);
}
давно
Старший Модератор
312929
1973
14.02.2017, 04:49
общий
Адресаты:
Долго рылся во всяких стандартных библ функциях си с целью найти какую-нибудь готовую функцию.


А в чистом си такой стандартной функции и нет - в отличие от того же PHP.
давно
Мастер-Эксперт
425
4118
14.02.2017, 05:05
общий
Адресаты:
Спасибо! А я пытался функции sprintf весь массив сразу скормить, но у меня ничего не вышло.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
14.02.2017, 11:50
общий
Адресаты:
Это точно, все сразу никак Только побайтно.
Еще вариант, если длина массива всегда одна и та же:
sprintf(s, "%02X%02X%02X", m[0], m[1], m[2]);
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
15.02.2017, 17:29
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Еще вариант, если длина массива всегда одна и та же:
sprintf(s, "%02X%02X%02X", m[0], m[1], m[2]);

Да, спасибо. Я как раз так и сделал.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
17.02.2017, 11:28
общий
это ответ
Здравствуйте, Вадим Исаев ака sir Henry!
В Си нет возможности вывести массив сразу, можно только по-элементно.
В мини-форуме было предложено несколько вариантов.
Наиболее подходящим оказался следующий (длина массива всегда одна и та же):

sprintf(s, "%02X%02X%02X", m[0], m[1], m[2]);
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа