Arduino:将字符串十六进制“#FFFFFF”转换为 3 int

Posted

技术标签:

【中文标题】Arduino:将字符串十六进制“#FFFFFF”转换为 3 int【英文标题】:Arduino: Convert a String hex "#FFFFFF" into 3 int 【发布时间】:2014-06-27 21:57:06 【问题描述】:

我对 C/C++ 完全陌生,我正在尝试弄清楚如何转换一个字符串参数,该参数将以 html 样式的 rgb 十六进制形式(例如“#ffffff”)并将其转换为 3 个整数变量

我真的不知道该去哪里。

【问题讨论】:

【参考方案1】:

首先,您需要解析您的值。你可以这样做:

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];

然后,您会将每个字符串转换为对应的整数。您可以从this 答案中学习如何做到这一点。

【讨论】:

【参考方案2】:

您需要做的就是将字符串转换为整数,然后将它们拆分为三个单独的 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;

您可能还想看看this question。


编辑(感谢 James cmets):

对于某些机器(例如 Arduino (Uno)),整数是 16 位而不是 32 位。如果您的红色值下降,请改用长整数。

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 开始,我无法将 'String' 转换为 'const char*' 您可以通过以下string v1 = "#FF3Fa0"; const char* v2 = v1.c_str()将字符串转换为const char*。而且,这个&hexstring[1]只是表示你取了hexstring[1]的地址,不管是string还是const char*。我已经修改了答案。 感谢雨辰的回答!我想注意的是,对于我的 Arduino (Uno) 整数是 16 位而不是 32 位。如果您的红色值正在下降,请尝试使用 long。 @James,这很有帮助!谢谢你。我在答案中添加了您的 cmets。 当我运行 string hexstring = "#FF3Fa0";我得到'字符串'没有在范围内声明【参考方案3】:
#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;

【讨论】:

以上是关于Arduino:将字符串十六进制“#FFFFFF”转换为 3 int的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个每个 8 位的数组(二进制数字字符串组合成一个 16 位的单个字符串?(arduino,移位寄存器)

将十六进制颜色值 (#ffffff) 转换为整数值

使用 php 将 MS Access 颜色转换为十六进制?

Arduino 如何将读到的数据前面加一个字母通过串口发送出去

有没有一种方法可以从名称中获取颜色,例如当程序读取白色时,它会显示 #FFFFFF hex [重复]

arduino串口监视器怎么输入