Arduino: 将字符串十六进制“#FFFFFF”转换为三个整数

9

我完全不懂C/C++,正在尝试弄清如何将形式为html样式rgb十六进制的字符串参数(例如“#ffffff”)转换为3个整数变量。

我真的不知道从哪里开始。

3个回答

20

你需要做的就是将字符串转换为整数,然后将它们分成三个单独的红、绿、蓝值。

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;

到目前为止,这个看起来是最好的,但问题是我从一个字符串类型开始,而我得到了“无法将'String'转换为'const char *'”的错误。 - Polygon Pusher
你可以通过以下方式将字符串转换为const char*string v1 = "#FF3Fa0"; const char* v2 = v1.c_str()。此外,&hexstring[1]表示你获取了hexstring[1]的地址,无论它是string还是const char*都没有关系。我已经修改了答案。 - Yuchen
2
谢谢你的答复,Yuchen!我想要指出的是,对于我的Arduino(Uno)来说,整数是16位而不是32位。如果红色值对你来说有所下降,请尝试使用long类型。 - James
@James,这非常有帮助!谢谢你。我在答案中添加了你的评论。 - Yuchen
当我运行string hexstring =“#FF3Fa0”;时,我得到“string”未在作用域中声明的错误。 - Jim True
@JimTrue 请添加 #include <string> - Yuchen

2
首先,您需要解析您的值。您可以这样做:
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];
}

然后,您将把每个字符串转换为其对应的整数。您可以从此答案中了解如何做到这一点:此网页

0
#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接