Skip to content

Instantly share code, notes, and snippets.

@dvtate
Last active November 7, 2016 06:43
Show Gist options
  • Save dvtate/83576c042b8c2c5dfae52e462ee77f45 to your computer and use it in GitHub Desktop.
Save dvtate/83576c042b8c2c5dfae52e462ee77f45 to your computer and use it in GitHub Desktop.
converts a string representing a hex number into 8-bit RGB values
#include <iostream>
#include <stdint.h>
#include <string.h>
// this solution is dependent on endianess, and is thus not cross-platform
struct RGB_t {
union {
struct {
// NOTE: this program does not handle middle-endian and
// may produce undefined behavior on such archatectures
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
unsigned char b, g, r;
#else // __ORDER_BIG_ENDIAN__
unsigned char r, g, b;
#endif // __ORDER_PDP_ENDIAN__
};
unsigned int val : 32;
};
};
RGB_t hexToClr(const char* hex){
RGB_t ret = { 0 };
for (uint8_t i = 0; i < 6; i++) {
ret.val <<= 4;
switch (hex[i]){
case '0': break;
case '1': ret.val += 1; break;
case '2': ret.val += 2; break;
case '3': ret.val += 3; break;
case '4': ret.val += 4; break;
case '5': ret.val += 5; break;
case '6': ret.val += 6; break;
case '7': ret.val += 7; break;
case '8': ret.val += 8; break;
case '9': ret.val += 9; break;
case 'A': case 'a':
ret.val += 10;
break;
case 'B': case 'b':
ret.val += 11;
break;
case 'C': case 'c':
ret.val += 12;
break;
case 'D': case 'd':
ret.val += 13;
break;
case 'E': case 'e':
ret.val += 14;
break;
case 'F': case 'f':
ret.val += 15;
break;
default:
std::cerr <<"FUCK YOU!\n";
break;
}
}
return ret;
}
RGB_t hex3ToClr(const char* hex){
RGB_t ret = {0};
for (uint8_t i = 0; i < 3; i++) {
for (uint8_t b = 0; b < 2; b++){
ret.val <<= 4;
switch (hex[i]){
case '0': break;
case '1': ret.val += 1; break;
case '2': ret.val += 2; break;
case '3': ret.val += 3; break;
case '4': ret.val += 4; break;
case '5': ret.val += 5; break;
case '6': ret.val += 6; break;
case '7': ret.val += 7; break;
case '8': ret.val += 8; break;
case '9': ret.val += 9; break;
case 'A': case 'a':
ret.val += 10;
break;
case 'B': case 'b':
ret.val += 11;
break;
case 'C': case 'c':
ret.val += 12;
break;
case 'D': case 'd':
ret.val += 13;
break;
case 'E': case 'e':
ret.val += 14;
break;
case 'F': case 'f':
ret.val += 15;
break;
default:
std::cerr <<"FUCK YOU!\n";
break;
}
}
}
return ret;
}
int main(){
std::cout <<"enter a color: #";
char hex[10];
std::cin >>hex;
RGB_t color = {0};
if (strlen(hex) == 3)
color = hex3ToClr(hex);
else
color = hexToClr(hex);
std::cout <<"\nred = " <<(int) color.r
<<"\ngreen = " <<(int) color.g
<<"\nblue = " <<(int) color.b <<'\n';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment