我完全不懂C/C++,正在尝试弄清如何将形式为html样式rgb十六进制的字符串参数(例如“#ffffff”)转换为3个整数变量。
我真的不知道从哪里开始。
你需要做的就是将字符串转换为整数,然后将它们分成三个单独的红、绿、蓝值。
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;
你可能也想看一下这个问题。
编辑(感谢James的评论):
对于某些机器(例如Arduino(Uno)),int是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;
编辑(更安全的版本,使用 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;
}
const char*
:string v1 = "#FF3Fa0"; const char* v2 = v1.c_str()
。此外,&hexstring[1]
表示你获取了hexstring[1]
的地址,无论它是string
还是const char*
都没有关系。我已经修改了答案。 - Yuchen#include <string>
。 - Yuchen