Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB? / 14 сообщений из 14, страница 1 из 1
01.12.2016, 13:00
    #39358399
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
Приветствую, такая задача, есть строка с описанием цвета в 16-ричной форме, скажем "0xFFAABB", есть структура типа RGB с тремя полями типа unsigned char r/g/b. Мне нужно распарсить эту строку и записать в структуру каждый компонент цвета в привычной форме, т.е от 0 до 255. Погуглил, встречается вариант типа:

Код: plaintext
1.
2.
3.
4.
RGB(int hexValue) {
    _r = ((hexValue >> 16) & 0xFF) / 255.0;  // Extract the RR byte
    _g = ((hexValue >> 8) & 0xFF) / 255.0;   // Extract the GG byte
    _b = ((hexValue) & 0xFF) / 255.0;        // Extract the BB byte



Но тут целочисленное, а у меня строка, не въеду, как поступить, может подскажете? (
...
Рейтинг: 0 / 0
01.12.2016, 13:11
    #39358415
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
I dont knowНо тут целочисленное, а у меня строка, не въеду, как поступить

Разве преобразовать строку в целое с помощью, например, atoi - не самоочевидное решение?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.12.2016, 15:11
    #39358537
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
Dimitry Sibiryakov,
Не, atoi вернёт 0. Шарю по форумам, походу, надо сначала в какую-то промежуточную форму преобразовать, или по частям преобразовывать.
...
Рейтинг: 0 / 0
01.12.2016, 15:27
    #39358551
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
I dont knowесть строка с описанием цвета в 16-ричной форме
что в строке?
...
Рейтинг: 0 / 0
01.12.2016, 17:51
    #39358768
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
Изопропил,
Строка именно такого вида "0xFFFFFF" Поигрался ещё с функцией strtoul(), она возвращает корректное значение, если ей передать строку без "0x", но при переводе в RGB(по приведенному выше коду), в RGB записываются только единицы, а не числовое значение 255.
Наверно буду предварительно обрабатывать эту строку - отсекать "0x", остальное передавать в strtoul(), осталось определеить, как сделать так, чтобы в поля структуры RGB записывалось именно значение 0-255, а не просто 0-1.
...
Рейтинг: 0 / 0
01.12.2016, 18:50
    #39358836
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
Если уж перевести или написать свой переводчик из 16-ричной сложно, то просто сделай свой парсер.
Каждый цвет два разряда, выдирай по две буквы из строки и считай
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int color(char r1, char r0) {
   return hex(r1) * 16 + hex(r0);
}

int hex(char x) {
   if(x >= '0' && x <= '9') {
     return x - '0';
   } else if(x >= 'A' && x <= 'F') {
     return x - 'A' + 10;
   } else {
      return 0;
   }
}
...
Рейтинг: 0 / 0
01.12.2016, 18:55
    #39358840
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
I dont know,

Код: plaintext
1.
sscanf_s("0xFFAABB", "%x", &r);



I dont knowосталось определеить, как сделать так, чтобы в поля структуры RGB записывалось именно значение 0-255, а не просто 0-1.

ниччего не понимаю. Не дели на 255.0 и диапазон будет 0..255
...
Рейтинг: 0 / 0
01.12.2016, 20:00
    #39358889
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
ИзопропилНе дели на 255.0 и диапазон будет 0..255
Тоже так подумал уже, походу так и поступлю.

sscanf_s
Не кросплатформенна. Завтра ещё с ней попробую. Или как предложил Dima T накидаю "парсер"

P.S. Если не затруднит, растолкуйте, зачем вычитать символ:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int hex(char x) {
   if(x >= '0' && x <= '9') {
     return x - '0'; // зачем вот это
   } else if(x >= 'A' && x <= 'F') {
     return x - 'A' + 10;  // или это
   } else {
      return 0;
   }
}



Помню, где-то встречал объяснение, но его само не вспомню (
...
Рейтинг: 0 / 0
01.12.2016, 20:30
    #39358905
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
I dont knowP.S. Если не затруднит, растолкуйте, зачем вычитать символ:
потому что каждый символ ASCII имеет свой код. '0' = 48, 'A' = 65. Вобщем '0' это не ноль, потому и вычитать чтобы стал ноль.
...
Рейтинг: 0 / 0
01.12.2016, 20:42
    #39358912
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
Чудеса прямо, то strtol вдруг не работает, то sscanf не кроссплаформа )))

http://www.cplusplus.com/reference/cstdlib/strtol/?kw=strtol
http://en.cppreference.com/w/c/io/fscanf

А по-моему у кого то руки кучерявые.
...
Рейтинг: 0 / 0
02.12.2016, 05:35
    #39359041
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
SiemarglЧудеса прямо, то strtol вдруг не работает, то sscanf не кроссплаформа ))) sscanf_s - не кроссплатформа. Вообще не понимаю, зачем их придумали... плюс компиляторы постоянно ругаются на "старые" версии. Плюс тем, кто использует sscanf_s, приходится с инсталлятором тащить новый рантайм

ИзопропилI dont know,
Код: plaintext
1.
sscanf_s("0xFFAABB", "%x", &r);

Вроде так:
Код: plaintext
1.
sscanf_s("0xFFAABB", "0x%x", &r);



а ещё (у MS точно) есть макросы GetRValue, GetGValue, GetBValue, и макрос RGB собирающий цвет из компонентов
...
Рейтинг: 0 / 0
02.12.2016, 10:19
    #39359126
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
Всё, разобрался, всем спасибо :)
...
Рейтинг: 0 / 0
04.12.2016, 09:14
    #39359987
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
I dont knowDimitry Sibiryakov,
Не, atoi вернёт 0. Шарю по форумам, походу, надо сначала в какую-то промежуточную форму преобразовать, или по частям преобразовывать.


надо использовать аналоги atoi с возможностью указать основание системы счисления, из которой переводим, и все.
также это умеет делать scanf()
...
Рейтинг: 0 / 0
04.12.2016, 09:16
    #39359988
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Есть строка с цветом вида 0xFFAABB, как привести её в нормальный вид RGB? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]