简体   繁体   English

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

[英]Arduino: Convert a String hex “#FFFFFF” into 3 int

I'm completely new to C/C++ and I am trying to figure out how to convert a String argument that would be in the form of a html style rgb hex such as "#ffffff" and turn that into 3 integers vars 我是C / C ++的新手,我试图弄清楚如何转换一个字符串参数,该参数将以html样式rgb hex的形式出现,例如“#ffffff”并将其转换为3个整数变量

I'm really not sure where to being. 我真的不确定在哪里。

All you need to do is convert the string to integers and then split them into three separate r, g, b values. 您需要做的就是将字符串转换为整数,然后将它们分成三个独立的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;

You may want to have a look at this question as well. 您可能也想看看这个问题


Edit (thanks to James comments): 编辑(感谢詹姆斯评论):

For some machine (eg Arduino (Uno)), ints are 16 bits instead of 32. If red values are dropping for you, use a long instead. 对于某些机器(例如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;

Edit (an even safer version, use strtoll instead of strtol ): 编辑(更安全的版本,使用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;

First, you need to parse your value. 首先,您需要解析您的价值。 You may do that this way: 你可以这样做:

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

Then, you will convert each string into it's correspondent integer. 然后,您将每个字符串转换为它的对应整数。 You can learn how to do that from this answer. 您可以从这个答案中学习如何做到这一点

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM