Arduino: преобразование строки hex "#FFFFFF " в 3 int
Я совершенно новичок в C / C++, и я пытаюсь выяснить, как преобразовать строковый аргумент, который будет в виде HTML-стиля rgb hex, такого как "#ffffff", и превратить его в 3 целых числа vars
Я действительно не уверен, где быть.
3 ответов
все, что вам нужно сделать, это преобразовать строку в целые числа, а затем разделить их на три отдельных значения r, g, B.
string hexstring = "#FF3Fa0";
// Get rid of '#' and convert it to integer
int number = (int) strtol( &hexstring[1], NULL, 16);
// Split them up into r, g, b values
int r = number >> 16;
int g = number >> 8 & 0xFF;
int b = number & 0xFF;
возможно, вы захотите взглянуть на этот вопрос как хорошо.
Edit (благодаря комментариям Джеймса):
для некоторых машин (например, Arduino (Uno)), ints-16 бит вместо 32. Если красные значения падают для вас, используйте long вместо этого.
string hexstring = "#FF3Fa0";
// Get rid of '#' and convert it to integer
long number = strtol( &hexstring[1], NULL, 16);
// Split them up into r, g, b values
long r = number >> 16;
long g = number >> 8 & 0xFF;
long b = number & 0xFF;
изменить (an еще более безопасная версия, используйте strtoll
вместо strtol
):
long long number = strtoll( &hexstring[1], NULL, 16);
// Split them up into r, g, b values
long long r = number >> 16;
long long g = number >> 8 & 0xFF;
long long b = number & 0xFF;
во-первых, вам нужно проанализировать свое значение. Вы можете сделать это так:
void parse_hex(char* a, char* b, char* c, const char* string) {
//certainly not the most elegant way. Note that we start at 1 because of '#'
a[0] = string[1];
a[1] = string[2];
b[0] = string[3];
b[1] = string[4];
c[0] = string[5];
c[1] = string[6];
}
затем вы преобразуете каждую строку в соответствующее целое число. Вы можете узнать, как это сделать из этой ответ.
#include <stdlib.h>
#include <iostream>
int main()
{
char const* str = "#FF9922";
char red[5] = {0};
char green[5] = {0};
char blue[5] = {0};
red[0] = green[0] = blue[0] = '0';
red[1] = green[1] = blue[1] = 'X';
red[2] = str[1];
red[3] = str[2];
green[2] = str[3];
green[3] = str[4];
blue[2] = str[5];
blue[3] = str[6];
int r = strtol(red, NULL, 16);
int g = strtol(green, NULL, 16);
int b = strtol(blue, NULL, 16);
std::cout << "Red: " << r << ", Green: " << g << ", Blue: " << b << std::endl;
}