簡體   English   中英

C / C ++十六進制char *到字節數組

[英]C/C++ Hex char* to byte array

我一段時間以來一直在嘗試如何在嵌入式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”。

我應該如何進行此轉換的任何幫助都將非常棒:)

謝謝!

sscanf(hexString,"%x%x%x",&colorBytes); 是:

  1. sscanf希望您給出3個int作為參數,但只給出一個數組,而不是int
  2. 單個%x讀取超過2個字符。

嘗試:

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

編輯:

關於scanf系列的非常有用的信息: http : //en.cppreference.com/w/c/io/fscanf

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

使用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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM