0

文字列は「#123456」のようになり、結果は次のようになります。

int r = 0x12;
int g = 0x34;
int b = 0x56;

または、C++ でのこのタスクの単純な逆:

RGB int 値を文字列の色に変換する方法

現在の文字列を 3 つの部分文字列に分割できることはわかっていますが、それらを 16 進値として実装するにはどうすればよいですか?

4

7 に答える 7

5

標準ライブラリのstd::hex:

#include <iostream>
#include <sstream>

int main()
{
   // The hex code that should be converted ...
   std::string hexCode;
   std::cout << "Please enter the hex code: ";
   std::cin >> hexCode;

   // ... and the target rgb integer values.
   int r, g, b;

   // Remove the hashtag ...
   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';
}
于 2014-10-25T13:31:02.573 に答える
0

文字列を 3 つの数字に分割した後、sscanf()を試してください。

于 2013-08-23T08:52:37.243 に答える
0

単純な解決策は次のとおりです。

unsigned int str_to_hex(char const * p, char const * e) noexcept
{
    unsigned int result = 0;
    while (p != e)
    {
        result *= 16;
        if ('0' <= *p && *p <= '9') { result += *p - '0';  continue; }
        if ('A' <= *p && *p <= 'F') { result += *p + 10 - 'A'; continue; }
        if ('a' <= *p && *p <= 'f') { result += *p + 10 - 'a'; continue; }
        return -1;
    }
}

std::tuple<unsigned char, unsigned char, unsigned char>
str_to_col(std::string const & s)
{
    if (str.length() != 7 || s[0] == '#') { /* error */ }

    auto r = str_to_hex(str.data() + 1, str.data() + 3);
    auto g = str_to_hex(str.data() + 3, str.data() + 5);
    auto b = str_to_hex(str.data() + 5, str.data() + 7);

    if (r == -1 || g == -1 || b == -1) { /* error */ }

    return {r, g, b};
}

入力を別の場所で検証した場合は、最後の関数を省略して only と言うことができますreturn { str_to_hex(...), ... };


または、文字列をまったく分割する必要はありません。

std::string s = "#123456";

auto n = str_to_hex(s.data() + 1, s.data() + 7);

auto r = n / 0x10000, g = (n / 0x100) % 0x100, b = n % 0x10000;

自作str_to_hex関数の代わりに、 などの標準ライブラリの変換関数を使用することもできますstd::strtoul(s.substring(1), nullptr, 16)

于 2013-08-23T08:53:38.557 に答える