2014-05-10 16 views

Trả lời

13

Tất cả những gì bạn cần làm là chuyển đổi chuỗi thành số nguyên và sau đó chia chúng thành ba giá trị r, g, b riêng biệt.

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; 

Bạn cũng có thể muốn xem this question.


Chỉnh sửa (nhờ James comments):

Đối với một số máy (ví dụ như Arduino (Uno)), ints 16 bit thay vì 32. Nếu giá trị màu đỏ được thả cho bạn, sử dụng một thay vào đó.

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; 

Chỉnh sửa (một phiên bản thậm chí an toàn, sử dụng strtoll thay vì 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; 
+0

Cái này trông tốt nhất với tôi cho đến nay nhưng vấn đề là tôi' m bắt đầu với một loại String và tôi nhận được không thể chuyển đổi 'String' thành 'const char *' –

+0

Bạn có thể chuyển đổi một chuỗi thành 'const char *' bằng chuỗi sau đây = "# FF3Fa0"; const char * v2 = v1.c_str() '. Ngoài ra, '& hexstring [1]' này đơn giản có nghĩa là bạn lấy địa chỉ của 'hexstring [1]', không quan trọng cho dù đó là 'string' hay' const char * '. Tôi đã sửa đổi câu trả lời. –

+2

Cảm ơn câu trả lời Yuchen! Tôi muốn lưu ý rằng đối với Arduino (Uno) ints của tôi là 16 bit thay vì 32. Nếu giá trị màu đỏ đang giảm cho bạn, hãy thử sử dụng một thời gian dài để thay thế. – James

2

Trước tiên, bạn cần phải phân tích cú pháp giá trị của mình. Bạn có thể làm theo cách này:

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

Sau đó, bạn sẽ chuyển đổi từng chuỗi thành số nguyên tương ứng. Bạn có thể tìm hiểu cách thực hiện điều đó từ câu trả lời this.

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; 
} 
Các vấn đề liên quan