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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23576827/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 00:29:36  来源:igfitidea点击:

Arduino: Convert a String hex "#FFFFFF" into 3 int

c++carduinohex

提问by Polygon Pusher

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 十六进制形式,例如“#ffffff”并将其转换为 3 个整数变量

I'm really not sure where to being.

我真的不知道要去哪里。

回答by Yuchen Zhong

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 questionas well.

您可能也想看看这个问题



Edit (thanks to James comments):

编辑(感谢詹姆斯评论):

For some machine (e.g. Arduino (Uno)), ints are 16 bits instead of 32. If red values are dropping for you, use a long instead.

对于某些机器(例如 Arduino (Uno)),整数是 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;


Edit (an even safer version, use strtollinstead 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;

回答by radgeRayden

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 thisanswer.

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

回答by R Sahu

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