1

我一直在尝试解决如何在嵌入式 C++ 中执行此操作一段时间,我有一个 RGB888 网站的十六进制颜色,例如“#ba00ff”,我想将其转换为 C++ RGB555 十六进制值,例如0x177C

目前我已经从字符串中修剪了 # 并坚持将其转换为可用于创建 RGB555 的类型

我的代码目前看起来像

 p_led_struct->color = "#ba00ff";
 char hexString[7] = {};
 memmove(hexString, p_led_struct->color+1, strlen(p_led_struct->color));
 byte colorBytes[3];
 sscanf(hexString,"%x%x%x",&colorBytes);

尽管 colorBytes 数组的数据不正确,但 hexString 值正确变为“ba00ff”。

关于我应该如何进行这种转换的任何帮助都会很棒:)

谢谢!

4

3 回答 3

2

存在的问题sscanf(hexString,"%x%x%x",&colorBytes);是:

  1. sscanf期望你给 3 ints 作为参数,但只给了一个数组,它不是int
  2. Single%x读取超过 2 个字符。

尝试:

int r, g, b;
if(sscanf(hexString,"%2x%2x%2x", &r, &g, &b) != 3) {
     // error
}

编辑:

关于 scanf-family 的非常有用的信息:http: //en.cppreference.com/w/c/io/fscanf

于 2013-10-01T12:25:48.200 回答
2

转换p_led_struct->color为整数

p_led_struct->color = "#ba00ff";
unsigned int colorValue = strtoul(p_led_struct->color+1, NULL, 16);

并将这个 RGB 值转换为 RGB555。RGB 整数的字段为 0000.0000.rrrr.rrrr.gggg.gggg.bbbb.bbbb,而 RGB555 的字段为 0rrr.rrgg.gggb.bbbb,所以我们只需要移位:

unsigned short rgb555 = ((colorValue & 0x00f80000) >> 9) +  // red
  ((colorValue & 0x0000f800) >> 7) +  // green
  ((colorValue & 0x000000f8) >> 3);  // blue
于 2013-10-01T12:37:49.290 回答
1

使用hh修饰符直接扫描成 1 个字节。

p_led_struct->color = "#ba00ff";
byte colorBytes[3];
int result;
result = sscanf( p_led_struct->color, "#%2hhx%2hhx%2hhx", &colorBytes[0], 
    &colorBytes[1], &colorBytes[2]);
if (result != 3) {
  ; // handle problem
}

成功扫描 3 个 RGB 8 位字节后,重新计算 3x5 位结果。

int r,g,b;
r = colorBytes[0] >> 3;
g = colorBytes[1] >> 3;
b = colorBytes[2] >> 3;
printf("%04X", (r << 10) | (g << 5) | (b << 0));
于 2013-10-01T12:30:45.680 回答