Получите шестнадцатеричные значения RGB из массива и передайте их в массив malloc как int

Мне нужен метод, как я могу получить шестнадцатеричное число из массива, а затем передать его в переменную с типом int. Я знаю, что это звучит просто, но мне нужно это "особым образом" - например:

Я задал шестнадцатеричный цвет RGB: 01a7ff — и сохранил значения R, G и B в дополнительных массивах — выглядя так:

char red[3];
red[0] = '0';
red[1] = '1';
red[2] = '\0';

char green[3];
green[0] = 'a';
green[1] = '7';
green[2] = '\0';

char blue[3];
blue[0] = 'f';
blue[1] = 'f';
blue[2] = '\0';

Теперь я хочу передать полный массив красного, зеленого и синего в зарезервированный массив malloc, чтобы он выглядел так:

char *data;
data = malloc(sizeof(char)*6);

data[0] = 01; //red array
data[1] = a7; //green array
data[2] = ff; //blue array

Сначала я попытался использовать atoi(), но это не сработало, если в массиве также были шестнадцатеричные литералы (a, b, c, d, e, f) - есть ли у кого-нибудь решение для меня?

Ваше здоровье


person s.r.    schedule 04.12.2017    source источник
comment
man strtoul поможет.   -  person Eugene Sh.    schedule 04.12.2017
comment
я пытался использовать strtol, но все время, когда я делал это, шестнадцатеричное число затем преобразовывалось в десятичное число.. man strtoul отличается?   -  person s.r.    schedule 04.12.2017
comment
тогда чего ты хочешь? Поместить их в массив символов?   -  person user2736738    schedule 04.12.2017
comment
Похоже на базовое непонимание представления данных.   -  person Eugene Sh.    schedule 04.12.2017
comment
Я хочу, чтобы шестнадцатеричные числа, которые хранятся в массиве (например, зеленый a7), копировались как a7 в данные [1] - так что буквально я хочу: data[1] = green;   -  person s.r.    schedule 04.12.2017
comment
Вы не хотите, чтобы data был массивом указателей на строки? Или даже массив строк?   -  person Eugene Sh.    schedule 04.12.2017
comment
Хорошо, я вижу, что это, вероятно, не работает.. Кажется, я что-то не понял..   -  person s.r.    schedule 04.12.2017
comment
char *data может работать не так, как ожидалось; обычный char может быть signed или unsigned, а 0xff может не вписываться в signed char. Вместо этого рассмотрим unsigned char *data.   -  person ad absurdum    schedule 04.12.2017


Ответы (1)


При условии, что данные содержат значения unsigned char, это должно делать:

data[0] = (unsigned char) strtol(red, NULL, 16);
data[1] = (unsigned char) strtol(green, NULL, 16);
data[2] = (unsigned char) strtol(blue, NULL, 16);

Примечание. Достаточно использовать беззнаковый символ для хранения значения данных от 0 до 255.

person sg7    schedule 04.12.2017
comment
Спасибо! Это было именно то, что я хотел - теперь я понимаю. :) - person s.r.; 04.12.2017
comment
Обратите внимание, что OP char *data может привести к неожиданным результатам как для data[1] = strtol(green, NULL, 16);, так и для data[2] = strtol(blue, NULL, 16);. - person ad absurdum; 04.12.2017
comment
@DavidBowling Ты прав! Я добавил уточнение для типа данных. - person sg7; 04.12.2017
comment
Это правда, обычный тип данных char насколько я понимаю принимает значения от -127 до 127. - person Tanner Babcock; 04.12.2017