[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
相關文章
- JavaScript 十六進位制顏色和RGB顏色值的相互轉換JavaScript
- jQuery顏色值轉換為十六進位制形式jQuery
- 十六進位制顏色值簡寫
- JavaScript 生成十六進位制顏色值JavaScript
- iOS 常用RGB十六進位制顏色轉換方法iOS
- 正則提取十六進位制顏色值
- C++資料格式化5 - uint轉換成十六進位制字串&二進位制的data列印成十六進位制字串C++UI字串
- 教你如何進行數倉字串、二進位制、十六進位制互轉字串
- Qt進位制轉換(十進位制轉十六進位制)QT
- JavaScript RGB轉換成16進位制顏色JavaScript
- 【譯】CSS 十六進位制顏色揭祕CSS
- 進位制數轉換方法(八/十六/十)
- 十六進位制顏色透明度對照表
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- leedcode-數字轉換為十六進位制數
- [顏色進位制轉換]js實現rgb和hex的相互轉換JS
- [20190819]如何快速轉換16進位制串到字串.txt字串
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- C# 解析16進位制字串。將16進位制字串轉換成明文字串C#字串
- Python處理十六進位制與二進位制轉換的問題——binascii自帶庫PythonASCII
- 十進位制轉十六進位制
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- JavaScript rgb與十六進位制格式轉換JavaScript
- c++的進位制轉換C++
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 牛客網測試題 把十六進位制數字轉換為十進位制數字
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- Python實現"數字轉換為十六進位制"的兩種方法
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- Go語言實現十進位制轉換成二、八、十六進位制Go
- 二進位制、十進位制與十六進位制相互轉化
- 僅做筆記用:base64字串轉換為十六進位制形式表示的二進位制資料筆記字串