You only need to convert the hex value (in parts) to decimal and vice versa. It is also necessary to consider what value in hexadecimal can contain 6 or 3 characters (without the '#' character).
Python 3.5 implementation
"""Utils for working with colors.""" import textwrap def rgb_to_hex(value1, value2, value3): """ Convert RGB value (as three numbers each ranges from 0 to 255) to hex format. >>> rgb_to_hex(235, 244, 66) '#EBF442' >>> rgb_to_hex(56, 28, 26) '#381C1A' >>> rgb_to_hex(255, 255, 255) '#FFFFFF' >>> rgb_to_hex(0, 0, 0) '#000000' >>> rgb_to_hex(203, 244, 66) '#CBF442' >>> rgb_to_hex(53, 17, 8) '#351108' """ for value in (value1, value2, value3): if not 0 <= value <= 255: raise ValueError('Value each slider must be ranges from 0 to 255') return '#{0:02X}{1:02X}{2:02X}'.format(value1, value2, value3) def hex_to_rgb(value): """ Convert color`s value in hex format to RGB format. >>> hex_to_rgb('fff') (255, 255, 255) >>> hex_to_rgb('ffffff') (255, 255, 255) >>> hex_to_rgb('#EBF442') (235, 244, 66) >>> hex_to_rgb('#000000') (0, 0, 0) >>> hex_to_rgb('#000') (0, 0, 0) >>> hex_to_rgb('#54433f') (84, 67, 63) >>> hex_to_rgb('#f7efed') (247, 239, 237) >>> hex_to_rgb('#191616') (25, 22, 22) """ if value[0] == '#': value = value[1:] len_value = len(value) if len_value not in [3, 6]: raise ValueError('Incorect a value hex {}'.format(value)) if len_value == 3: value = ''.join(i * 2 for i in value) return tuple(int(i, 16) for i in textwrap.wrap(value, 2)) if __name__ == '__main__': import doctest doctest.testmod()
JavaScript implementation (adapted to NodeJS with ES6 support)
const assert = require('assert'); /** * Return a color`s value in the hex format by passed the RGB format. * @param {integer} value1 An value in ranges from 0 to 255 * @param {integer} value2 An value in ranges from 0 to 255 * @param {integer} value3 An value in ranges from 0 to 255 * @return {string} A color`s value in the hex format */ const RGBtoHex = (value1, value2, value3) => { const values = [value1, value2, value3]; let result = '#'; for (let i = 0; i < 3; i += 1) { // validation input if (values[i] < 0 || values[i] > 255) throw new Error('An each value of RGB format must be ranges from 0 to 255'); // append to result values as hex with at least width 2 result += (('0' + values[i].toString(16)).slice(-2)); } return result.toUpperCase(); }; /** * Convert a value from the hex format to RGB and return as an array * @param {int} value A color`s value in the hex format * @return {array} Array values of the RGB format */ const hexToRGB = (value) => { let val = value; val = (value[0] === '#') ? value.slice(1) : value; if ([3, 6].indexOf(val.length) === -1) throw new Error(`Incorect a value of the hex format: ${value}`); if (val.length === 3) val = val.split('').map(item => item.repeat(2)).join(''); return val.match(/.{2}/g).map(item => parseInt(`0x${item}`, 16)); }; assert.deepEqual(hexToRGB('fff'), [255, 255, 255]); assert.deepEqual(hexToRGB('#fff'), [255, 255, 255]); assert.deepEqual(hexToRGB('#000000'), [0, 0, 0]); assert.deepEqual(hexToRGB('000000'), [0, 0, 0]); assert.deepEqual(hexToRGB('#d7dee8'), [215, 222, 232]); assert.deepEqual(hexToRGB('#1E2F49'), [30, 47, 73]); assert.deepEqual(hexToRGB('#030914'), [3, 9, 20]); assert.equal(RGBtoHex(255, 255, 255), '#FFFFFF'); assert.equal(RGBtoHex(0, 0, 0), '#000000'); assert.equal(RGBtoHex(96, 102, 112), '#606670'); assert.equal(RGBtoHex(199, 204, 214), '#C7CCD6'); assert.equal(RGBtoHex(22, 99, 224), '#1663E0'); assert.equal(RGBtoHex(0, 8, 20), '#000814'); module.exports.RGBtoHex = RGBtoHex; module.exports.hexToRGB = hexToRGB;
C implementation (designed for standard C11)
// a type for a struct of RGB color typedef struct _ColorRGB { unsigned short int red; unsigned short int green; unsigned short int blue; } colorRGB_t; /* Convert a color`s value from the hex format to the RGB. Return -1 if a passed value in the hex format is not correct, otherwise - return 0; */ static int convertColorHexToRGB(const char originValue[], colorRGB_t *colorRGB) { // a full value of color in hex format must constains 6 charapters char completedValue[6]; size_t lenOriginValue; size_t lenCompletedValue; // an intermediary variable for keeping value in the hex format char hexSingleValue[3]; // a temp pointer to char, need only to the strtol() char *ptr; // a variable for keeping a converted number in the hex to the decimal format long int number; // validation input lenOriginValue = strlen(originValue); if (lenOriginValue > 7 || lenOriginValue < 3) return -1; // copy value without sign '#', if found as first in the string (originValue[0] == '#') ? strcpy(completedValue, originValue + 1) : strcpy(completedValue, originValue); lenCompletedValue = strlen(completedValue); // if the value has only 3 charapters, dublicate an each after itself // but if not full version of the hex name of a color (6 charapters), return -1 if (lenCompletedValue == 3) { completedValue[5] = completedValue[2]; completedValue[4] = completedValue[2]; completedValue[3] = completedValue[1]; completedValue[2] = completedValue[1]; completedValue[1] = completedValue[0]; } else if (lenCompletedValue != 6) return -1; // convert string, by parts, to decimal values and keep it in a struct sprintf(hexSingleValue, "%c%c", completedValue[0], completedValue[1]); number = strtol(hexSingleValue, &ptr, 16); colorRGB->red = number; sprintf(hexSingleValue, "%c%c", completedValue[2], completedValue[3]); number = strtol(hexSingleValue, &ptr, 16); colorRGB->green = number; sprintf(hexSingleValue, "%c%c", completedValue[4], completedValue[5]); number = strtol(hexSingleValue, &ptr, 16); colorRGB->blue = number; return 0; } /* Convert a color`s value from the RGB format to the hex */ static int convertColorRGBToHex(const colorRGB_t *colorRGB, char value[8]) { sprintf(value, "#%02X%02X%02X", colorRGB->red, colorRGB->green, colorRGB->blue); return 0; } /* Forming a string representation data in an instance of the structure colorRGB_t */ static int getRGBasString(const colorRGB_t *colorRGB, char str[18]) { sprintf(str, "rgb(%d, %d, %d)", colorRGB->red, colorRGB->green, colorRGB->blue); return 0; } int main (int argv, char **argc) { char str[18]; char hex[8]; colorRGB_t *colorRGB_; colorRGB_ = (colorRGB_t *)malloc(sizeof(colorRGB_)); convertColorHexToRGB("fff", colorRGB_); getRGBasString(colorRGB_, str); printf("Hex 'fff' to RGB %s\n", str); convertColorRGBToHex(colorRGB_, hex); printf("RGB %s to hex '%s'\n", str, hex); convertColorHexToRGB("000000", colorRGB_); getRGBasString(colorRGB_, str); printf("Hex '000000' to RGB %s\n", str); convertColorRGBToHex(colorRGB_, hex); printf("RGB %s to hex '%s'\n", str, hex); convertColorHexToRGB("#000000", colorRGB_); getRGBasString(colorRGB_, str); printf("Hex '#000000' to RGB %s\n", str); convertColorRGBToHex(colorRGB_, hex); printf("RGB %s to hex '%s'\n", str, hex); convertColorHexToRGB("#FFF", colorRGB_); getRGBasString(colorRGB_, str); printf("Hex '#FFF' to RGB %s\n", str); convertColorRGBToHex(colorRGB_, hex); printf("RGB %s to hex '%s'\n", str, hex); free(colorRGB_); }
Result after compilation (I use GCC)
Hex 'fff' to RGB rgb(255, 255, 255) RGB rgb(255, 255, 255) to hex '#FFFFFF' Hex '000000' to RGB rgb(0, 0, 0) RGB rgb(0, 0, 0) to hex '#000000' Hex '#000000' to RGB rgb(0, 0, 0) RGB rgb(0, 0, 0) to hex '#000000' Hex '#FFF' to RGB rgb(255, 255, 255) RGB rgb(255, 255, 255) to hex '#FFFFFF'