C++で16進数文字列をASCII文字列に変換する方法
このチュートリアルでは、C++を使って16進数の値を含む文字列をASCII文字列に変換するプログラムについて解説します。
ここでは、16進数の値が並んだ文字列が与えられます。私たちのタスクは、その16進数の値を読み取り、対応するASCII文字列へと変換することです。
アルゴリズムの流れ
- 16進数文字列から先頭から2文字ずつ部分文字列として取り出します。
- 取り出した2文字をstoul関数を使って基数16(16進数)として解釈し、整数値に変換します。
- 変換した整数値をchar型にキャストし、ASCII文字列に連結します。
- この処理を文字列の末尾まで繰り返します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
string convert_ASCII(string hex){
string ascii = "";
for (size_t i = 0; i < hex.length(); i += 2){
// 16進数文字列から2文字を取り出す
string part = hex.substr(i, 2);
// 基数16として整数値に変換する
char ch = stoul(part, nullptr, 16);
// ASCII文字列に連結する
ascii += ch;
}
return ascii;
}
int main(){
cout << convert_ASCII("6176656e67657273") << endl;
return 0;
}出力
avengers
コードの解説
上記のコードでは、convert_ASCII関数に16進数文字列「6176656e67657273」を渡しています。この文字列を2文字ずつ区切ると「61」「76」「65」「6e」「67」「65」「72」「73」となり、それぞれをASCIIコードとして解釈すると「a」「v」「e」「n」「g」「e」「r」「s」に対応します。そのため、最終的な出力結果は「avengers」となります。
ポイントとなるのは標準ライブラリのstoul関数です。この関数は文字列を指定した基数の符号なし整数に変換でき、第3引数に16を指定することで16進数文字列を数値へと変換できます。変換後の値はchar型に代入されることで、対応するASCII文字になります。
なお、このサンプルコードでは入力文字列の長さが奇数だった場合や無効な16進数が含まれていた場合のチェックは行っていません。実用的なプログラムに組み込む際は、文字列長の妥当性確認や例外処理(stoulは不正な入力に対してinvalid_argument例外を投げます)を追加することをおすすめします。
-
C++で文字のASCII値を取得・表示する方法を解説
ASCII(American Standard Code for Information Interchange:米国標準情報交換コード)には、0から127までの番号が振られた128種類の文字が定義されています。アルファベット、数字、記号など、さまざまな文字に固有の数値が対応付けられているのが特徴です。 主な文字とそのASCII値の例は以下のとおりです。 文字ASCII値 A65 a97 Z90 z122 $36 &38 ?63 大文字と小文字では異なる値が割り当てられている点にも注目してください。たとえば「A」は65、「a」は97となっており、両者の差は32です。この規
-
C++でint型をstring型に変換する方法を解説
整数(int)を文字列(string)に変換したい場合、いくつかの方法があります。まずはC言語由来のitoa関数を使う方法から見ていきましょう。 itoa関数を使う方法 itoaは「integer to ASCII」の略で、整数値を文字列に変換するC言語の関数です。以下のように使用します。 例 #include<iostream> int main() { int a = 10; char *intStr = itoa(a); string str = string(intStr); cout << str; } 出力 このコードを実行す