【问题标题】:C/C++ Hex char* to byte arrayC/C++ Hex char* 到字节数组
【发布时间】:2013-10-07 14:18:33
【问题描述】:

一段时间以来,我一直在尝试如何在嵌入式 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”。

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

谢谢!

【问题讨论】:

  • 如果跳过第一个字符,字符串长度不需要减1吗?
  • 我相信字符串 '/n' 的结尾使 "ba00ff" 有 7 个字符,我不确定 sscanf 中没有字符串 char 结尾的 char 数组是否会导致错误。 编辑抱歉,我的意思是“空终止”\0 不是 /n
  • '/n' 是换行符,而不是终止符。您的字符串中没有换行符。
  • 但我很少使用 C 字符串,所以我可能对字符串长度有误。
  • memmove 很好;最好在字符串末尾加上'\0'

标签: c++ c hex scanf


【解决方案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));

【讨论】:

  • 最后一行打错了,现在你得到一个基于红色的灰度:)
  • @Jongware 感谢并修复。现在唯一红的是我的脸。 :)
  • 谢谢 Chux,我想了解解决方案应该 result = sscanf( p_led_struct-&gt;color, "#%2hhx%2hhx%2hhx", &amp;colorBytes[0], &amp;colorBytes[0], &amp;colorBytes[0]);&amp;colorBytes[0], &amp;colorBytes[1], &amp;colorBytes[2] 还是所有对第一个地址的引用?
  • @Tim Kalinowski 又一个哎呀。感谢您指出。
【解决方案2】:

p_led_struct-&gt;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

【讨论】:

    【解决方案3】:

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

    1. sscanf 期望您提供 3 个 ints 作为参数,但只提供了一个数组,而不是 int
    2. 单个 %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

    【讨论】:

    • 太棒了,效果很好,感谢您解释如何正确使用 sscanf!
    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2017-10-27
    相关资源
    最近更新 更多