HOWTO · C++

C++ で文字列を 16 進数に変換する

この記事では、C++ で文字列を 16 進数に変換する方法を紹介します。

この記事では、C++ で文字列を 16 進数に変換する方法について、複数の方法を紹介します。

C++ で文字列を 16 進数に変換するには std::coutstd::hex を使用する

16 進数表記は、プログラムファイル、エンコードされたフォーマット、または単なるテキストを表すバイナリファイルを読み取るための一般的なフォーマットです。したがって、ファイルの内容を 16 進数データで生成し、必要に応じて出力する必要があります。

この例では、格納されている string オブジェクトを 16 進数でコンソールに出力します。C++ には、ストリームデータの数値ベースを変更できる I/O マニピュレータ std::hex が用意されていることに注意してほしい。string オブジェクトは 1つの文字として分解された後、std::hex でそれぞれの 16 進数表現に変更されなければならません。範囲ベースのループを実装して、string の文字を繰り返し処理し、変更されたデータを cout ストリームにリダイレクトします。

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

using std::cout;
using std::endl;
using std::hex;
using std::string;
using std::stringstream;

int main() {
  string s1 = "This will be converted to hexadecimal";
  string s2;

  cout << "string: " << s1 << endl;
  cout << "hexval: ";
  for (const auto &item : s1) {
    cout << hex << int(item);
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

string: This will be converted to hexadecimal
hexval: 546869732077696c6c20626520636f6e76657274656420746f2068657861646563696d616c

std::stringstreamstd::hex を用いて、C++ で文字列を 16 進数値に変換する

これまでの方法では、16 進数データをオブジェクトに格納する機能が欠けていました。この問題を解決するには、stringstream オブジェクトを作成し、そこに string 文字の 16 進数値を反復処理を用いて挿入することです。データが stringstream に入ると、変更された文字データを格納するための新しい string オブジェクトを構築することができます。

データは stringstream オブジェクトから直接出力することもできるが、以下のコード例では、よりシンプルな形式である cout << string を採用しています。別の最終用途として、標準ライブラリのファイルシステムユーティリティを使って、16 進数データを直接ファイルに書き込むこともできます。

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

using std::cout;
using std::endl;
using std::hex;
using std::string;
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 << "hexval: " << s2 << endl;

  return EXIT_SUCCESS;
}

出力:

string: This will be converted to hexadecimal
hexval: 546869732077696c6c20626520636f6e76657274656420746f2068657861646563696d616c