实战c++中的string系列--十六进制的字符串转为十六进制的整型(一般是颜色代码使用)

非常久没有写关于string的博客了。由于写的差点儿相同了。可是近期又与string打交道,于是荷尔蒙上脑,小蝌蚪躁动。

在程序中,假设用到了颜色代码,一般都是十六进制的,即hex。

可是server给你返回一个颜色字符串。即hex string

你怎么把这个hex string 转为 hex,并在你的代码中使用?

更进一步,你怎么办把一个形如”#ffceed”的hex string 转为 RGB呢?

第一个问题在Java中是这样搞的:

public static int parseColor(@Size(min=1) String colorString) {
if (colorString.charAt(0) == ‘#‘) {
// Use a long to avoid rollovers on #ffXXXXXX
long color = Long.parseLong(colorString.substring(1), 16);
if (colorString.length() == 7) {
// Set the alpha value
color |= 0x00000000ff000000;
} else if (colorString.length() != 9) {
throw new IllegalArgumentException("Unknown color");
}
return (int)color;
} else {
Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
if (color != null) {
return color;
}
}
throw new IllegalArgumentException("Unknown color");
}

可是在C++中,我们能够用流,这样更加简洁:

    auto color_string_iter = hex_string_color.begin();
    hex_string_color.erase(color_string_iter);
    hex_string_color= "ff" + hex_string_color;
    DWORD color;
    std::stringstream ss;
    ss << std::hex << hex_string_color;
    ss >> std::hex >> color;

    btn1->SetBkColor(color);
    btn2->SetBkColor(0xff123456);

还有一种方法,能够使用:std::strtoul

主要是第三个參数:

Numerical base (radix) that determines the valid characters and their interpretation.

If this is 0, the base used is determined by the format in the sequence

#include <cstdlib>
#include <iostream> // for std::cout

int main()
{
    char hex_string[] = "0xbeef";
    unsigned long hex_value
        = std::strtoul(hex_string, 0, 16);
    std::cout << "hex value: " << hex_value << std::endl;
    return 0;
}

接下来看看怎样把hex string 转rgb:

#include <iostream>
#include <sstream>

int main()
{
   std::string hexCode;
   std::cout << "Please enter the hex code: ";
   std::cin >> hexCode;

   int r, g, b;

   if(hexCode.at(0) == ‘#‘) {
      hexCode = hexCode.erase(0, 1);
   }

   // ... and extract the rgb values.
   std::istringstream(hexCode.substr(0,2)) >> std::hex >> r;
   std::istringstream(hexCode.substr(2,2)) >> std::hex >> g;
   std::istringstream(hexCode.substr(4,2)) >> std::hex >> b;

   // Finally dump the result.
   std::cout << std::dec << "Parsing #" << hexCode
      << " as hex gives (" << r << ", " << g << ", " << b << ")" << ‘\n‘;
}

这里有一点忠告,也是忠告自己。

我们从学习编程開始,最熟悉的就是print或是cout看看结果。可是在实际工作中是非常少用到的。

比方有一个十进制数100。我们何以通过cout<

时间: 2024-10-02 06:56:01

实战c++中的string系列--十六进制的字符串转为十六进制的整型(一般是颜色代码使用)的相关文章

实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

实战c++中的string系列--string的分割、替换(类似string.split或是explode())

对一个字符串根据某个字符进行分割也是在实战中经常遇到的问题,也是面试中经常会被人提及的. 如果你是个C Sharp程序员,你会知晓string.split函数,有下面这些重载: 1) public string[] Split(params char[] separator) 2) public string[] Split(char[] separator, int count) 3) public string[] Split(char[] separator, StringSplitOpt

实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

今天继续写一些string操作. string给我们提供了很多的方法,但是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\program files\csdn",但是我想得到"D:\program files\vagaa"这个路径. 这就需要字符串的替换 std::string full_path = "D:\\program files\\csdn" const size_t last_

实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样. 这就看到了吧,返回值是const char*,这里须要注意一下. 1 string转const char* 当然是用到上面所述的方法c_str(): string s1 = "abcdeg"; const char *k =

实战c++中的string系列--string的遍历(使用下标还是iterator)

迭代器提供了访问容器中对象的方法.例如,可以使用一对迭代器指定list或vector中的一定范围的对象.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象. 我们都知道可以用下标运算来访问string对象和vector对象.而另外还有一种更通用的方法也可以实现这样的方法.名曰:迭代器(iterator). 类似于指针,迭代器也提供了对对象的间接访问.就迭代器而言,其对象是容器中的元素或者strin

实战c++中的string系列--std::string与MFC中CString的转换

搞过MFC的人都知道cstring,给我们提供了很多便利的方法. CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多.不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景下走出来的程序员来说有点难以学习. 但是很多情况下,我们还是需要cstring和string的转换. 分两步: 1把cstring转为char数组 2根据char数组,构造自己的string(记得释放内存) std::string CStringT

实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)

当函数返回字符串的时候,我们可以定义返回string和string&. 1写一个返回string引用的函数 std::string & TestStringReference() { std::string loal_str = "holy shit"; return loal_str; } 这个函数当然是错误的,编译器会提示我们: 返回局部变量或临时变量的地址: loal_str 即不能返回局部变量的引用. 2写一个返回string的函数(函数返回局部变量string

实战c++中的string系列--string的连接(+= or append or push_back)

string的连接也是经常用到的,string重载了一些运算符: 首先看一看重载+运算符,用于串联两个字符串对象: 源码: template<class CharType, class Traits, class Allocator> basic_string<CharType, Traits, Allocator> operator+( const basic_string<CharType, Traits, Allocator>& _Left, const

实战c++中的string系列--CDuiString和string的转换(duilib中的cduistring)

使用所duilib的人定会知道cduistring类型,先看看这个类是怎么定义的: class UILIB_API CDuiString { public: enum { MAX_LOCAL_STRING_LEN = 127/*63*/ }; CDuiString(); CDuiString(const TCHAR ch); CDuiString(const CDuiString& src); CDuiString(LPCTSTR lpsz, int nLen = -1); ~CDuiStrin