75283


C++初心者です。  
[以下のようなコード](https://www.delftstack.com/ja/howto/cpp/string-to-hex-
cpp/)で、文字列を16進数文字列に変換しました。

[code]

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <iterator>
    
    using std::cout; using std::endl;
    using std::string; using std::hex;
    using std::stringstream;
    
    int main() {
        string s1 = "This will be converted to hexadecimal";
        string s2;
        stringstream ss;
    
        cout << "string: " << s1 << endl;
    
        for (const auto& item : s1) {
            ss << hex << int(item);
        }
        s2 = ss.str();
        cout << s2 << endl;
    
        return EXIT_SUCCESS;
    }
    
[/code]

上記のコードを実行すると、変数`s2`は`"546869732077696c6c20626520636f6e76657274656420746f2068657861646563696d616c"`であることが分かります。

その後に、その変数`s2`を16進数文字列を、16進数の数値に変換して、16進数同士の足し算の計算などをし、再度16進数の文字列に戻したいのですが、どうしたら出来るのでしょうか？  
C++の16進数の数値というのはint型なのかunsignedInt型なのかなど、そのあたりから分からないので知りたいです。


CC BY-SA 4.0
2021-04-15T01:06:52.470
75282
2021-04-15T02:58:34.773
36446
question
c++
C++で16進数の文字列と、16進数の数値の相互変換の方法を知りたい


C++言語に用意されている[数値型は64bit程度](https://ja.cppreference.com/w/cpp/language/types)です。  
64bitというと、16進数文字列で8文字、元の文字列では4文字分でしかありません。

それ以上の桁数の計算を行うのであれば、ご自身で自作するか、外部のライブラリを使用することになります。行いたい演算にもよりますが、例えば[Boost.Multiprecision](https://www.boost.org/doc/libs/1_75_0/libs/multiprecision/doc/html/index.html)なんかが使えるかもしれません。

* * *

ちなみに、[先の回答](https://ja.stackoverflow.com/a/75249/4236)で

> C++言語において文字とは文字コードを値に持つ数値でもあります。

説明しました。16進数文字列に対して演算を行う必要はなく、元の文字列を数値として扱い、直接演算した方が効率的です。（そうだとしても、64bitで8文字分ですが…。）


CC BY-SA 4.0
2021-04-15T02:39:06.873
75283
2021-04-15T02:39:06.873
4236
75282
answer


16進数文字列という中間的な値を取らずに、直接`std::string`と`std::vector<char>`の間を変換した方が良いのでは？

文字列から文字(数値)の配列(vector)への変換：  
[How to copy std::string into std::vector?
[duplicate]](https://stackoverflow.com/q/8263926/9014308)

>
[code]

>     std::string str = "hello";
>     std::vector<char> data(str.begin(), str.end());
>  
[/code]

文字(数値)の配列(vector)から文字列への変換：  
[std::vectorをstd::stringやchar*に変換する](https://gin0606.hatenablog.com/entry/2013/12/12/162218)

> `std::vector<char>`型の変数`vecChar`があるとする。
[code]

>     // -> std::string
>     std::string stdString(vecChar.begin(), vecChar.end());
>  
[/code]

* * *

`C++の16進数の数値というのはint型なのかunsignedInt型なのか`という疑問は少しずれていて、`数値`というのが`型`を持っているのではなく、それぞれの`型`で取り扱える`数値の範囲`が定義されている訳です。それはコンパイラとかOSとかオプション指定とかの条件で決まるか変えられたりします。

で、おそらく相応しい問いは`C++の1文字`で扱える数値の型は何か？ということでしょう。  
こちらに資料があります。  
[string - cpprefjp -
C++日本語リファレンス](https://cpprefjp.github.io/reference/string.html)

> char_traits 文字特性(class template)
>
> basic_string 汎用文字型の文字列(class template)  
>  string マルチバイト文字列(type-alias)

[std::basic_string - cpprefjp -
C++日本語リファレンス](https://cpprefjp.github.io/reference/string/basic_string.html)

> string char型文字列。ASCII、UTF-8等のマルチバイト文字列や、バイト配列として使用する。

[std::char_traits - cpprefjp -
C++日本語リファレンス](https://cpprefjp.github.io/reference/string/char_traits.html)

`std::string`の各文字は`std::char`で、コンパイラやオプションとかOSに依存するでしょうが、だいたい8bitでしょう。符号の有無は環境依存でしょうか。


CC BY-SA 4.0
2021-04-15T02:51:58.003
75286
2021-04-15T02:58:34.773
2021-04-15T02:58:34.773
26370
26370
75282
answer