[C/C++11]_[初級]_[如何轉換帶井號的#十六進位制顏色字串到數值]
場景
- 表示顏色的
RGB
值,一般有兩種方法,一種是使用使用數值表示RGB(255,255,255)
,一種是使用字串#FE07AB
.那麼字串形式的表示如何得到r,g,b
各值的數值大小呢?
說明
-
在
<WinGDI.h>
裡有對RGB
巨集的定義, 其實就是一個24
位元組的值,每個顏色值佔用8
位元組。#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
-
在
C++11
出現之前,十六進位制字串轉換為數值並沒有stoi
這種方便的標準函式,有了這個函式,通過設定_Base
為16
,我們可以讓函式理解字串為十六進位制字串,並相應的轉換為十進位制數值。inline int stoi(const string& _Str, size_t *_Idx = 0,int _Base = 10) inline long stol(const string& _Str, size_t *_Idx = 0,int _Base = 10)
-
在只支援
C++98
的編譯器裡,沒有stoi
函式,我們也可以裡用std::stringstream
字串流來轉換,而不需要判斷並轉換字串裡的每個字元。看例子。
例子
test-hex-to-int.cpp
#include "utils.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <sstream>
#include <tuple>
#include <math.h>
using namespace std;
static int ConvertHexToInt(const char* buf,size_t bufSize)
{
std::stringstream ss;
ss << std::hex;
ss.write(buf,bufSize);
int result = 0;
ss >> result;
return result;
}
std::tuple<int,int,int> ColorHexToRGBCpp98(const char* str)
{
if(str == NULL)
return std::make_tuple(0,0,0);
if(*str == '#')
str += 1;
static const int kLen = 6;
if(strlen(str) != kLen)
return std::make_tuple(0,0,0);
auto r = ConvertHexToInt(str,2);
auto g = ConvertHexToInt(str+2,2);
auto b = ConvertHexToInt(str+4,2);
return std::make_tuple(r,g,b);
}
std::tuple<int,int,int> ColorHexToRGBCpp11(const char* str)
{
if(str == NULL)
return std::make_tuple(0,0,0);
if(*str == '#')
str += 1;
static const int kLen = 6;
if(strlen(str) != kLen)
return std::make_tuple(0,0,0);
auto r = std::stoi(std::string(str,2),0,16);
auto g = std::stoi(std::string(str+2,2),0,16);
auto b = std::stoi(std::string(str+4,2),0,16);
return std::make_tuple(r,g,b);
}
int main(int argc, char const *argv[])
{
Utils::Log("hello","world");
int r,g,b;
std::tie(r,g,b) = ColorHexToRGBCpp98("FFFFFF");
Utils::Print("===========ColorHexToRGBCpp98(FFFFFF)==============");
Utils::Log("r",r);
Utils::Log("g",b);
Utils::Log("b",b);
std::tie(r,g,b) = ColorHexToRGBCpp98("FE07AB");
Utils::Print("============ColorHexToRGBCpp98(FE07AB)=============");
Utils::Log("r",r);
Utils::Log("g",b);
Utils::Log("b",b);
std::tie(r,g,b) = ColorHexToRGBCpp11("FFFFFF");
Utils::Print("===========ColorHexToRGBCpp11(FFFFFF)==============");
Utils::Log("r",r);
Utils::Log("g",b);
Utils::Log("b",b);
std::tie(r,g,b) = ColorHexToRGBCpp11("FE07AB");
Utils::Print("============ColorHexToRGBCpp11(FE07AB)=============");
Utils::Log("r",r);
Utils::Log("g",b);
Utils::Log("b",b);
getchar();
return 0;
}
utils.h
#ifndef UTILS_H
#define UTILS_H
#include <iostream>
struct Utils{
template<typename K,typename T>
static void Log(K k,T t){
std::cout << k << "=" << t << std::endl;
}
template<typename T>
static void Print(T t){
std::cout << t << std::endl;
}
template<typename K,typename T>
static void LogHex(K k,T t){
std::cout << k << "=" << std::hex << t << std::endl;
}
};
#endif
輸出
hello=world
===========ColorHexToRGBCpp98(FFFFFF)==============
r=255
g=255
b=255
============ColorHexToRGBCpp98(FE07AB)=============
r=254
g=171
b=171
===========ColorHexToRGBCpp11(FFFFFF)==============
r=255
g=255
b=255
============ColorHexToRGBCpp11(FE07AB)=============
r=254
g=171
b=171
相關文章
- jQuery顏色值轉換為十六進位制形式jQuery
- JavaScript 十六進位制顏色和RGB顏色值的相互轉換JavaScript
- 將十六進位制顏色值轉換為RGB顏色值程式碼例項
- js實現的十六進位制顏色和RGB顏色值的相互轉換JS
- 十六進位制顏色值簡寫
- JavaScript 生成十六進位制顏色值JavaScript
- 正則提取十六進位制顏色值
- iOS 常用RGB十六進位制顏色轉換方法iOS
- 十六進位制和RGB顏色格式的相互轉換
- 匹配十六進位制顏色值正規表示式
- 十六進位制顏色字串轉換成Color在Silverlight中的實現字串
- 十六進位制顏色轉換為RGB程式碼例項
- javascriptRGB顏色轉換到16進位制詳解JavaScript
- C++資料格式化5 - uint轉換成十六進位制字串&二進位制的data列印成十六進位制字串C++UI字串
- 隨機生成十六進位制顏色值程式碼例項隨機
- 教你如何進行數倉字串、二進位制、十六進位制互轉字串
- 【譯】CSS 十六進位制顏色揭祕CSS
- Qt進位制轉換(十進位制轉十六進位制)QT
- js隨機生成十六進位制顏色值程式碼例項JS隨機
- 【進位制轉換】十進位制與十六進位制相互轉換方法
- 十六進位制轉換為八進位制
- 十六進位制轉換為十進位制
- 十六進位制顏色透明度對照表
- 匹配十六進位制顏色正規表示式
- 進位制數轉換方法(八/十六/十)
- 十六進位制數轉十進位制
- JavaScript RGB轉換成16進位制顏色JavaScript
- Swift3.0-16進位制顏色轉換UIColorSwiftUI
- RGB顏色與16進位制顏色的換算方法
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- leedcode-數字轉換為十六進位制數
- [顏色進位制轉換]js實現rgb和hex的相互轉換JS
- (轉)【iOS 開發】二進位制、十進位制、十六進位制相互轉換的方法iOS