【C#】byte配列を16進数文字列(Hex)へ変換・整形出力する

目次

概要

デバッグ時のログ出力や、ハッシュ値(MD5/SHA256)の表示などで、バイナリデータ(byte[])を可読性のある16進数文字列に変換する実装です。 .NETの標準メソッドを使用した一括変換と、可読性を高めるための整形出力(スペース区切りや改行)の両方を解説します。

仕様(入出力)

  • 入力
    • 任意のバイト配列(byte[]
  • 出力
    • 16進数表記された文字列(例: 4A30...
    • 用途に応じて、区切り文字(スペース、ハイフン)や改行を含める
  • 前提
    • Convert.ToHexString メソッドは .NET 5 以降で使用可能です。それ以前(.NET Framework等)の場合は BitConverter を使用します。

基本の使い方

最もシンプルに、バイト配列を区切り文字なしの連続した16進文字列に変換する方法です。

byte[] data = { 0xAB, 0xCD, 0xEF };

// .NET 5以降 (推奨)
string hex = Convert.ToHexString(data); 
// 結果: "ABCDEF"

// .NET Framework / 古い環境
string hexOld = BitConverter.ToString(data).Replace("-", "");
// BitConverterは "AB-CD-EF" を返すためハイフンを除去する

コード全文

バイト配列を「完全な文字列として取得する場合」と「ログ用に整形してコンソール出力する場合」の2パターンを実装したコンソールアプリケーションです。

using System;
using System.Text;
using System.Linq;

class Program
{
    static void Main()
    {
        // 1. テスト用のダミーデータ(32バイト)
        // 00から1Fまでの連番データを生成
        byte[] buffer = Enumerable.Range(0, 32).Select(i => (byte)i).ToArray();

        Console.WriteLine("--- 1. 文字列への一括変換 ---");
        
        // .NET 5以降: 最も高速で簡潔
        string hexSimple = Convert.ToHexString(buffer);
        Console.WriteLine($"[Simple]: {hexSimple}");

        // BitConverter: ハイフン区切りが必要な場合
        string hexHyphen = BitConverter.ToString(buffer);
        Console.WriteLine($"[Hyphen]: {hexHyphen}");

        Console.WriteLine();
        Console.WriteLine("--- 2. ループ処理による整形出力 ---");

        // 1バイトずつ処理して整形表示(スペース区切り)
        // StringBuilderを使用するとパフォーマンスが良い
        StringBuilder sb = new StringBuilder();
        
        foreach (byte b in buffer)
        {
            // "X2" = 大文字16進数2桁, "x2" = 小文字
            sb.Append($"{b:X2} ");
        }
        
        Console.WriteLine($"[Formatted]: {sb.ToString().TrimEnd()}");
    }
}

実行結果例

--- 1. 文字列への一括変換 ---
[Simple]: 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
[Hyphen]: 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F-10-11-12-13-14-15-16-17-18-19-1A-1B-1C-1D-1E-1F

--- 2. ループ処理による整形出力 ---
[Formatted]: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

カスタムポイント

  • 大文字・小文字の指定
    • フォーマット指定子 X2 は大文字(AF)、x2 は小文字(af)を出力します。
  • 区切り文字の変更
    • BitConverter.ToString はデフォルトでハイフン - で区切りますが、これを Replace で削除したり、コロン : に置換してMACアドレス風に表現したりできます。
  • StringBuilderの活用
    • ループ内で Console.Write を繰り返すと遅くなるため、大量のデータを扱う場合は StringBuilder に溜め込んでから出力してください。

注意点

  1. メモリ使用量
    • 1バイトのデータは16進数文字列にすると2文字(2バイト)になります。巨大なバイナリデータを一度に文字列化すると、元の2倍以上のメモリを消費するため注意してください。
  2. BitConverterの挙動
    • BitConverter.ToString() は要素間に必ずハイフンを挿入します。ハイフン不要な場合に .Replace("-", "") を行うのは一般的ですが、無駄な中間文字列が生成されるため、パフォーマンス重視なら Convert.ToHexString(.NET 5+)を使用してください。

応用

バイナリエディタ風のダンプ出力

16バイトごとに改行し、オフセット位置を表示する、より高度なダンプ出力の実装例です。

public static void PrintHexDump(byte[] data)
{
    for (int i = 0; i < data.Length; i++)
    {
        // 先頭にオフセット表示 (例: 0000: )
        if (i % 16 == 0)
        {
            Console.Write($"{i:X4}: ");
        }

        // データの16進表示
        Console.Write($"{data[i]:X2} ");

        // 16バイトごとに改行
        if ((i + 1) % 16 == 0)
        {
            Console.WriteLine();
        }
    }
    // 末尾で改行
    Console.WriteLine();
}

まとめ

単純な変換であれば、最新の.NET環境では Convert.ToHexString が最も効率的かつ記述が短く済みます。一方、デバッグ用途で見やすく整形したい場合や、古いフレームワークで動作させる必要がある場合は、BitConverterStringBuilder を用いたループ処理を組み合わせて対応してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次