[C言語] 16進数と2進数の文字列を相互に変換する方法
C言語では、16進数と2進数の文字列を相互に変換するために、標準ライブラリの関数やループを活用します。
16進数の文字列を2進数に変換するには、各16進数の文字を4ビットの2進数に変換し、文字列として結合します。
逆に、2進数の文字列を16進数に変換するには、4ビットずつ区切って16進数に変換し、文字列として結合します。
これらの操作は、ビット演算や文字列操作を駆使して実現できます。
16進数から2進数への変換
16進数から2進数への変換は、C言語でプログラムを作成する際に役立つ基本的な操作です。
16進数は0から9の数字とAからFのアルファベットを使用して表現され、2進数は0と1のビットで表現されます。
このセクションでは、16進数を2進数に変換する方法を解説します。
変換の基本原理
16進数の各桁は、4ビットの2進数に対応しています。
以下の表は、16進数の各桁とその2進数の対応を示しています。
| 16進数 | 2進数 | 
|---|---|
| 0 | 0000 | 
| 1 | 0001 | 
| 2 | 0010 | 
| 3 | 0011 | 
| 4 | 0100 | 
| 5 | 0101 | 
| 6 | 0110 | 
| 7 | 0111 | 
| 8 | 1000 | 
| 9 | 1001 | 
| A | 1010 | 
| B | 1011 | 
| C | 1100 | 
| D | 1101 | 
| E | 1110 | 
| F | 1111 | 
C言語での変換方法
C言語で16進数を2進数に変換するには、各桁を4ビットの2進数に変換し、それを連結する方法を取ります。
以下にサンプルコードを示します。
#include <stdio.h>
#include <string.h>
// 16進数文字列を2進数文字列に変換する関数
void hexToBinary(const char *hex, char *binary) {
    // 16進数の各桁に対応する2進数の文字列
    const char *hexToBinTable[] = {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011",
        "1100", "1101", "1110", "1111"
    };
    // 変換処理
    while (*hex) {
        if (*hex >= '0' && *hex <= '9') {
            strcat(binary, hexToBinTable[*hex - '0']);
        } else if (*hex >= 'A' && *hex <= 'F') {
            strcat(binary, hexToBinTable[*hex - 'A' + 10]);
        }
        hex++;
    }
}
int main() {
    char hex[] = "1A3F";
    char binary[65] = ""; // 16桁の16進数は最大64桁の2進数になる
    hexToBinary(hex, binary);
    printf("16進数: %s\n", hex);
    printf("2進数: %s\n", binary);
    return 0;
}16進数: 1A3F
2進数: 0001101000111111このプログラムは、16進数の文字列を入力として受け取り、それを対応する2進数の文字列に変換します。
hexToBinary関数は、16進数の各桁を4ビットの2進数に変換し、結果を連結して出力します。
2進数から16進数への変換
2進数から16進数への変換は、デジタルデータを扱う際に非常に便利です。
2進数はコンピュータ内部でのデータ表現に使われ、16進数はそのデータを人間が読みやすくするために使われます。
このセクションでは、2進数を16進数に変換する方法を解説します。
変換の基本原理
2進数から16進数への変換は、2進数を4ビットずつ区切って、それぞれを16進数の1桁に変換することで行います。
以下の表は、2進数の4ビットとその16進数の対応を示しています。
| 2進数 | 16進数 | 
|---|---|
| 0000 | 0 | 
| 0001 | 1 | 
| 0010 | 2 | 
| 0011 | 3 | 
| 0100 | 4 | 
| 0101 | 5 | 
| 0110 | 6 | 
| 0111 | 7 | 
| 1000 | 8 | 
| 1001 | 9 | 
| 1010 | A | 
| 1011 | B | 
| 1100 | C | 
| 1101 | D | 
| 1110 | E | 
| 1111 | F | 
C言語での変換方法
C言語で2進数を16進数に変換するには、2進数の文字列を4ビットずつ読み取り、それを16進数の文字に変換します。
以下にサンプルコードを示します。
#include <stdio.h>
#include <string.h>
#include <math.h>
// 2進数文字列を16進数文字列に変換する関数
void binaryToHex(const char *binary, char *hex) {
    int len = strlen(binary);
    int hexIndex = 0;
    int value = 0;
    // 4ビットずつ処理
    for (int i = 0; i < len; i += 4) {
        value = 0;
        for (int j = 0; j < 4 && (i + j) < len; j++) {
            value = value * 2 + (binary[i + j] - '0');
        }
        if (value < 10) {
            hex[hexIndex++] = '0' + value;
        } else {
            hex[hexIndex++] = 'A' + (value - 10);
        }
    }
    hex[hexIndex] = '#include <stdio.h>
#include <string.h>
#include <math.h>
// 2進数文字列を16進数文字列に変換する関数
void binaryToHex(const char *binary, char *hex) {
int len = strlen(binary);
int hexIndex = 0;
int value = 0;
// 4ビットずつ処理
for (int i = 0; i < len; i += 4) {
value = 0;
for (int j = 0; j < 4 && (i + j) < len; j++) {
value = value * 2 + (binary[i + j] - '0');
}
if (value < 10) {
hex[hexIndex++] = '0' + value;
} else {
hex[hexIndex++] = 'A' + (value - 10);
}
}
hex[hexIndex] = '\0'; // 文字列の終端
}
int main() {
char binary[] = "0001101000111111";
char hex[17] = ""; // 64桁の2進数は最大16桁の16進数になる
binaryToHex(binary, hex);
printf("2進数: %s\n", binary);
printf("16進数: %s\n", hex);
return 0;
}
'; // 文字列の終端
}
int main() {
    char binary[] = "0001101000111111";
    char hex[17] = ""; // 64桁の2進数は最大16桁の16進数になる
    binaryToHex(binary, hex);
    printf("2進数: %s\n", binary);
    printf("16進数: %s\n", hex);
    return 0;
}2進数: 0001101000111111
16進数: 1A3Fこのプログラムは、2進数の文字列を入力として受け取り、それを対応する16進数の文字列に変換します。
binaryToHex関数は、2進数の文字列を4ビットずつ読み取り、それを16進数の文字に変換して出力します。
文字列としての変換
C言語で数値を文字列として扱うことは、データの表示やファイルへの書き込み、ネットワーク通信などで非常に重要です。
特に、16進数や2進数の数値を文字列として変換することで、データの可読性を向上させることができます。
このセクションでは、数値を文字列として変換する方法を解説します。
数値から文字列への変換
数値を文字列に変換するためには、sprintf関数を使用します。
この関数は、数値を指定したフォーマットで文字列に変換することができます。
16進数の文字列変換
16進数の数値を文字列に変換するには、%Xまたは%xフォーマット指定子を使用します。
以下にサンプルコードを示します。
#include <stdio.h>
int main() {
    int number = 6703; // 16進数で1A3F
    char hexString[10];
    // 数値を16進数の文字列に変換
    sprintf(hexString, "%X", number);
    printf("数値: %d\n", number);
    printf("16進数の文字列: %s\n", hexString);
    return 0;
}数値: 6703
16進数の文字列: 1A3Fこのプログラムは、整数を16進数の文字列に変換し、sprintf関数を使用してフォーマット指定子%Xで出力します。
2進数の文字列変換
C言語には直接2進数を文字列に変換するフォーマット指定子はありませんが、ビット操作を用いて手動で変換することができます。
以下にサンプルコードを示します。
#include <stdio.h>
// 数値を2進数の文字列に変換する関数
void intToBinaryString(int number, char *binaryString) {
    for (int i = 15; i >= 0; i--) {
        binaryString[15 - i] = (number & (1 << i)) ? '1' : '0';
    }
    binaryString[16] = '#include <stdio.h>
// 数値を2進数の文字列に変換する関数
void intToBinaryString(int number, char *binaryString) {
for (int i = 15; i >= 0; i--) {
binaryString[15 - i] = (number & (1 << i)) ? '1' : '0';
}
binaryString[16] = '\0'; // 文字列の終端
}
int main() {
int number = 6703; // 2進数で0001101000111111
char binaryString[17];
// 数値を2進数の文字列に変換
intToBinaryString(number, binaryString);
printf("数値: %d\n", number);
printf("2進数の文字列: %s\n", binaryString);
return 0;
}
'; // 文字列の終端
}
int main() {
    int number = 6703; // 2進数で0001101000111111
    char binaryString[17];
    // 数値を2進数の文字列に変換
    intToBinaryString(number, binaryString);
    printf("数値: %d\n", number);
    printf("2進数の文字列: %s\n", binaryString);
    return 0;
}数値: 6703
2進数の文字列: 0001101000111111このプログラムは、整数を2進数の文字列に変換し、ビット操作を用いて各ビットを文字列に変換します。
文字列から数値への変換
文字列を数値に変換するには、strtol関数を使用します。
この関数は、文字列を指定した基数で数値に変換します。
16進数の文字列から数値への変換
#include <stdio.h>
#include <stdlib.h>
int main() {
    char hexString[] = "1A3F";
    int number;
    // 16進数の文字列を数値に変換
    number = strtol(hexString, NULL, 16);
    printf("16進数の文字列: %s\n", hexString);
    printf("数値: %d\n", number);
    return 0;
}16進数の文字列: 1A3F
数値: 6703このプログラムは、16進数の文字列を数値に変換し、strtol関数を使用して基数16で変換します。
2進数の文字列から数値への変換
#include <stdio.h>
#include <stdlib.h>
int main() {
    char binaryString[] = "0001101000111111";
    int number;
    // 2進数の文字列を数値に変換
    number = strtol(binaryString, NULL, 2);
    printf("2進数の文字列: %s\n", binaryString);
    printf("数値: %d\n", number);
    return 0;
}2進数の文字列: 0001101000111111
数値: 6703このプログラムは、2進数の文字列を数値に変換し、strtol関数を使用して基数2で変換します。
応用例
C言語での16進数と2進数の変換は、さまざまな応用が可能です。
ここでは、バイナリデータの解析、ネットワークプログラミング、暗号化アルゴリズムでの利用について解説します。
バイナリデータの解析
バイナリデータの読み込み
バイナリデータを解析するためには、まずファイルからデータを読み込む必要があります。
C言語では、fread関数を使用してバイナリデータを読み込むことができます。
#include <stdio.h>
int main() {
    FILE *file = fopen("data.bin", "rb");
    if (file == NULL) {
        perror("ファイルを開けません");
        return 1;
    }
    unsigned char buffer[16];
    size_t bytesRead = fread(buffer, 1, sizeof(buffer), file);
    fclose(file);
    printf("読み込んだバイナリデータ: ");
    for (size_t i = 0; i < bytesRead; i++) {
        printf("%02X ", buffer[i]);
    }
    printf("\n");
    return 0;
}このプログラムは、data.binというバイナリファイルを開き、16バイトのデータを読み込んで16進数で表示します。
16進数表示での解析
バイナリデータを16進数で表示することで、データの内容を視覚的に解析しやすくなります。
上記のコードでは、printf関数を使用して16進数でデータを表示しています。
ネットワークプログラミングでの利用
IPアドレスの変換
ネットワークプログラミングでは、IPアドレスを数値から文字列に変換することがよくあります。
C言語では、inet_ntop関数を使用してこの変換を行います。
#include <stdio.h>
#include <arpa/inet.h>
int main() {
    struct in_addr ipAddr;
    ipAddr.s_addr = htonl(0xC0A80001); // 192.168.0.1
    char ipStr[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &ipAddr, ipStr, INET_ADDRSTRLEN);
    printf("IPアドレス: %s\n", ipStr);
    return 0;
}このプログラムは、数値で表現されたIPアドレスを文字列に変換し、表示します。
データパケットの解析
ネットワークデータパケットを解析する際には、バイナリデータを16進数で表示して内容を確認することが重要です。
これにより、プロトコルのヘッダーやペイロードの内容を解析できます。
暗号化アルゴリズムでの利用
ハッシュ値の表示
暗号化アルゴリズムでは、ハッシュ値を16進数で表示することが一般的です。
以下の例では、SHA-256ハッシュを計算し、16進数で表示します。
#include <stdio.h>
#include <openssl/sha.h>
int main() {
    unsigned char data[] = "Hello, World!";
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256(data, sizeof(data) - 1, hash);
    printf("SHA-256ハッシュ: ");
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");
    return 0;
}このプログラムは、Hello, World!という文字列のSHA-256ハッシュを計算し、16進数で表示します。
暗号化キーの変換
暗号化キーを16進数で表示することで、キーの内容を確認しやすくなります。
特に、キーの長さや内容を確認する際に役立ちます。
暗号化ライブラリを使用してキーを生成し、16進数で表示することができます。
まとめ
16進数と2進数の文字列変換は、C言語プログラミングにおいて重要なスキルです。
この記事では、基本的な変換方法から応用例までを解説しました。
これにより、バイナリデータの解析やネットワークプログラミング、暗号化アルゴリズムでの利用が可能になります。
これを機に、実際のプログラムでこれらの変換を試し、理解を深めてみてください。
 
![[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)