2013-10-01 116 views
1

我一直在試圖解決如何在嵌入式C++中做一段時間,現在我已經在RGB888網站中使用了十六進制顏色,例如「#ba00ff」我想轉換成C++ RGB555十六進制值,例如0x177CC/C++十六進制字符*到字節數組

目前我已經從字符串修剪#和我堅持它轉換成I型可用於創建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」有不正確的數據。

如何我應該做這種轉換的任何援助將是真棒:)

謝謝!

+0

如果跳過第一個字符,你不需要從字符串長度中減去1嗎? –

+1

我相信字符串'/ n'的結尾會產生「ba00ff」7個字符,我不確定在sscanf中沒有字符串char結尾的char數組是否會導致錯誤。 **編輯**對不起,我的意思是以'Null-terminated''\ 0'不是'/ n' –

+0

'/ n'是換行符,而不是終止符。你的字符串中沒有換行符。 –

回答

2

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

  1. sscanf希望你給3個int S作爲參數,但只有一個陣列,並給出它不是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

+0

真棒,這工作完美,感謝解釋如何正確使用sscanf! –

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)); 
+0

錯字在你的最後一行,現在你得到一個紅色的灰度:) – usr2564301

+0

@Jongware感謝和修復。現在唯一的紅色是我的臉。:) – chux

+0

謝謝Chux,我試圖理解解決方案應該 '結果= sscanf(p_led_struct->顏色,「#%2hhx%2hhx%2hhx」,&colorBytes [0],和colorBytes [0],和colorBytes [0] );' 是'&colorBytes [0],&colorBytes [1],&colorBytes [2]'或所有對第一個地址的引用? –

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 
相關問題