[C言語] 10進数の数値と16進数の文字列を相互変換する方法
C言語では、10進数の数値を16進数の文字列に変換するために、sprintf関数を使用します。例えば、sprintf(buffer, "%x", number)のように書くことで、numberを16進数の文字列としてbufferに格納できます。
逆に、16進数の文字列を10進数の数値に変換するには、sscanf関数を使用します。sscanf(hexString, "%x", &number)とすることで、hexStringを10進数の数値としてnumberに変換できます。
これらの方法を用いることで、C言語での数値と文字列の変換が容易になります。
10進数から16進数への変換
10進数を16進数に変換する方法は、C言語ではいくつかの方法があります。
ここでは、printf関数、sprintf関数、そして手動での変換アルゴリズムについて解説します。
printf関数を使った変換
printf関数を使うと、簡単に10進数を16進数に変換して表示することができます。
以下にその例を示します。
#include <stdio.h>
int main() {
    int decimalNumber = 255; // 10進数の数値
    printf("16進数: %x\n", decimalNumber); // %xを使って16進数に変換して表示
    return 0;
}16進数: ffこの例では、%xフォーマット指定子を使用して、10進数の数値を16進数として表示しています。
大文字の%Xを使うと、16進数の文字が大文字になります。
sprintf関数を使った変換
printf関数と同様に、sprintf関数を使って10進数を16進数の文字列に変換することもできます。
sprintfは結果を文字列として保存するために使用されます。
#include <stdio.h>
int main() {
    int decimalNumber = 255; // 10進数の数値
    char hexString[10]; // 変換後の16進数文字列を格納する配列
    sprintf(hexString, "%x", decimalNumber); // %xを使って16進数に変換して文字列に保存
    printf("16進数文字列: %s\n", hexString);
    return 0;
}16進数文字列: ffこの例では、sprintfを使って10進数を16進数の文字列に変換し、その結果をhexStringに格納しています。
手動での変換アルゴリズム
手動で10進数を16進数に変換する方法もあります。
これは、数値を16で割り、その余りを使って16進数の各桁を決定する方法です。
ループを使った変換方法
以下のコードは、ループを使って10進数を16進数に変換する方法を示しています。
#include <stdio.h>
int main() {
    int decimalNumber = 255; // 10進数の数値
    char hexString[10]; // 変換後の16進数文字列を格納する配列
    int index = 0; // 文字列のインデックス
    while (decimalNumber != 0) {
        int remainder = decimalNumber % 16; // 16で割った余りを取得
        if (remainder < 10) {
            hexString[index++] = 48 + remainder; // 0-9の文字に変換
        } else {
            hexString[index++] = 55 + remainder; // A-Fの文字に変換
        }
        decimalNumber = decimalNumber / 16; // 16で割った商を次の数値に
    }
    hexString[index] = '#include <stdio.h>
int main() {
int decimalNumber = 255; // 10進数の数値
char hexString[10]; // 変換後の16進数文字列を格納する配列
int index = 0; // 文字列のインデックス
while (decimalNumber != 0) {
int remainder = decimalNumber % 16; // 16で割った余りを取得
if (remainder < 10) {
hexString[index++] = 48 + remainder; // 0-9の文字に変換
} else {
hexString[index++] = 55 + remainder; // A-Fの文字に変換
}
decimalNumber = decimalNumber / 16; // 16で割った商を次の数値に
}
hexString[index] = '\0'; // 文字列の終端を設定
// 文字列を逆順にして表示
for (int i = index - 1; i >= 0; i--) {
printf("%c", hexString[i]);
}
printf("\n");
return 0;
}
'; // 文字列の終端を設定
    // 文字列を逆順にして表示
    for (int i = index - 1; i >= 0; i--) {
        printf("%c", hexString[i]);
    }
    printf("\n");
    return 0;
}ffこのコードでは、10進数を16で割り続け、余りを16進数の桁として配列に格納しています。
最後に、配列を逆順にして表示することで、正しい16進数の文字列を得ています。
文字列への変換手順
手動での変換では、余りを文字に変換し、文字列として格納する手順が重要です。
以下の手順で行います。
- 10進数を16で割り、余りを求める。
- 余りが10未満なら、’0’から’9’の文字に変換。
- 余りが10以上なら、’A’から’F’の文字に変換。
- 商が0になるまで繰り返す。
- 文字列を逆順にして完成。
この手順を用いることで、手動での10進数から16進数への変換が可能になります。
16進数から10進数への変換
16進数を10進数に変換する方法も、C言語ではいくつかの方法があります。
ここでは、sscanf関数、strtol関数、そして手動での変換アルゴリズムについて解説します。
sscanf関数を使った変換
sscanf関数を使うと、16進数の文字列を10進数に変換することができます。
以下にその例を示します。
#include <stdio.h>
int main() {
    char hexString[] = "ff"; // 16進数の文字列
    int decimalNumber; // 変換後の10進数を格納する変数
    sscanf(hexString, "%x", &decimalNumber); // %xを使って16進数文字列を10進数に変換
    printf("10進数: %d\n", decimalNumber);
    return 0;
}10進数: 255この例では、%xフォーマット指定子を使用して、16進数の文字列を10進数の数値に変換しています。
strtol関数を使った変換
strtol関数は、文字列を指定した基数の数値に変換するために使用されます。
16進数から10進数への変換にも利用できます。
#include <stdio.h>
#include <stdlib.h>
int main() {
    char hexString[] = "ff"; // 16進数の文字列
    int decimalNumber; // 変換後の10進数を格納する変数
    decimalNumber = strtol(hexString, NULL, 16); // 16進数の文字列を10進数に変換
    printf("10進数: %d\n", decimalNumber);
    return 0;
}10進数: 255この例では、strtol関数を使って16進数の文字列を10進数に変換しています。
第三引数に16を指定することで、16進数として解釈されます。
手動での変換アルゴリズム
手動で16進数を10進数に変換する方法もあります。
これは、各桁を16の累乗で重み付けして合計する方法です。
文字列から数値への変換手順
手動での変換では、以下の手順で16進数の文字列を10進数に変換します。
- 文字列の各文字を右から左に読み取る。
- 文字が’0’から’9’の場合、その値を取得。
- 文字が’A’から’F’の場合、10から15の値を取得。
- 各値に16の累乗を掛けて合計する。
ループを使った変換方法
以下のコードは、ループを使って16進数を10進数に変換する方法を示しています。
#include <stdio.h>
#include <string.h>
int main() {
    char hexString[] = "ff"; // 16進数の文字列
    int decimalNumber = 0; // 変換後の10進数を格納する変数
    int base = 1; // 16の累乗を表す変数
    int length = strlen(hexString); // 文字列の長さを取得
    for (int i = length - 1; i >= 0; i--) {
        if (hexString[i] >= '0' && hexString[i] <= '9') {
            decimalNumber += (hexString[i] - 48) * base; // '0'のASCII値を引いて数値に変換
        } else if (hexString[i] >= 'A' && hexString[i] <= 'F') {
            decimalNumber += (hexString[i] - 55) * base; // 'A'のASCII値を引いて数値に変換
        } else if (hexString[i] >= 'a' && hexString[i] <= 'f') {
            decimalNumber += (hexString[i] - 87) * base; // 'a'のASCII値を引いて数値に変換
        }
        base *= 16; // 次の桁の16の累乗を計算
    }
    printf("10進数: %d\n", decimalNumber);
    return 0;
}10進数: 255このコードでは、16進数の文字列を右から左に読み取り、各桁を16の累乗で重み付けして合計することで、10進数に変換しています。
大文字と小文字の両方に対応しています。
応用例
C言語での10進数と16進数の変換は、さまざまな応用が可能です。
ここでは、いくつかの具体的な応用例を紹介します。
16進数を用いたカラーコードの変換
ウェブデザインやグラフィックデザインでは、色を16進数のカラーコードで表現することが一般的です。
例えば、#FF5733のような形式です。
C言語を使って、これらのカラーコードをRGB値に変換することができます。
#include <stdio.h>
int main() {
    char colorCode[] = "FF5733"; // 16進数のカラーコード
    int red, green, blue;
    sscanf(colorCode, "%2x%2x%2x", &red, &green, &blue); // 16進数のカラーコードをRGBに変換
    printf("RGB: (%d, %d, %d)\n", red, green, blue);
    return 0;
}RGB: (255, 87, 51)この例では、16進数のカラーコードをRGBの10進数に変換しています。
メモリダンプの解析
メモリダンプは、プログラムのメモリ内容を16進数で表示したものです。
これを解析することで、プログラムの動作を理解したり、デバッグを行ったりすることができます。
#include <stdio.h>
void printMemoryDump(const unsigned char *data, size_t size) {
    for (size_t i = 0; i < size; i++) {
        printf("%02x ", data[i]); // メモリの内容を16進数で表示
        if ((i + 1) % 16 == 0) {
            printf("\n");
        }
    }
    printf("\n");
}
int main() {
    unsigned char data[] = {0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x01, 0x02, 0x03};
    printMemoryDump(data, sizeof(data));
    return 0;
}de ad be ef 00 01 02 03このコードは、メモリの内容を16進数で表示する簡単なメモリダンプの例です。
バイナリデータの操作
バイナリデータを操作する際には、16進数表記が便利です。
ファイルの内容を読み込んで、16進数で表示することで、データの内容を確認することができます。
#include <stdio.h>
void printBinaryFile(const char *filename) {
    FILE *file = fopen(filename, "rb");
    if (file == NULL) {
        perror("ファイルを開けません");
        return;
    }
    unsigned char buffer[16];
    size_t bytesRead;
    while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
        for (size_t i = 0; i < bytesRead; i++) {
            printf("%02x ", buffer[i]); // バイナリデータを16進数で表示
        }
        printf("\n");
    }
    fclose(file);
}
int main() {
    printBinaryFile("example.bin");
    return 0;
}このコードは、指定したバイナリファイルの内容を16進数で表示する例です。
ネットワークプログラミングでの利用
ネットワークプログラミングでは、IPアドレスやポート番号を16進数で扱うことがあります。
これにより、データの送受信を効率的に行うことができます。
#include <stdio.h>
#include <arpa/inet.h>
int main() {
    struct sockaddr_in sa;
    char ipAddress[] = "192.168.1.1";
    inet_pton(AF_INET, ipAddress, &(sa.sin_addr)); // IPアドレスをバイナリ形式に変換
    printf("16進数のIPアドレス: %x\n", ntohl(sa.sin_addr.s_addr)); // ネットワークバイトオーダーをホストバイトオーダーに変換して表示
    return 0;
}16進数のIPアドレス: c0a80101この例では、IPアドレスを16進数で表示しています。
デバッグ時の数値表示
デバッグ時に変数の値を16進数で表示することで、メモリの状態をより直感的に理解することができます。
特に、ポインタやビット操作を行う際に有用です。
#include <stdio.h>
int main() {
    int value = 12345;
    printf("10進数: %d, 16進数: %x\n", value, value); // 変数の値を10進数と16進数で表示
    return 0;
}10進数: 12345, 16進数: 3039このコードは、変数の値を10進数と16進数の両方で表示する例です。
デバッグ時に数値の確認を行う際に役立ちます。
まとめ
C言語での10進数と16進数の相互変換は、さまざまな場面で役立つ基本的な技術です。
この記事では、printfやsscanfなどの関数を使った変換方法から、手動での変換アルゴリズムまでを解説しました。
これらの知識を活用することで、プログラムのデバッグやデータの解析がより効率的に行えるようになります。
ぜひ、実際のプログラミングでこれらの技術を試してみてください。
 
![[C言語] atol関数の使い方 – 文字列をlong型数値に変換する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47138.png)
![[C言語] atof関数の使い方 – 文字列を浮動小数(double)に変換する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47137.png)
![[C言語] sprintf関数の使い方 – 複数の変数を文字列にフォーマット](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47139.png)
![[C言語] sscanf関数の使い方 – フォーマット指定でファイルから読み込む](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47140.png)
![[C言語] strcat 使い方 – 文字列の連結](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47141.png)
![[C言語] strcpy関数の使い方 – 文字列をコピーする](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47144.png)
![[C言語] strcmp関数の使い方 – 文字列を比較する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47143.png)
![[C言語] strchr関数の使い方 – 最初に見つかった文字の位置を取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47142.png)
![[C言語] strncat関数の使い方 – 指定文字分結合](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47148.png)
![[C言語] strlen関数の使い方 – 文字列の長さ(バイト数)の取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47147.png)
![[C言語] stricmp関数の使い方 – 大文字小文字を区別しない比較](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47146.png)
![[C言語] strcspn関数の使い方 – 文字群が含まれる位置を検索](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47145.png)