目次
概要
デバッグ時のログ出力や、ハッシュ値(MD5/SHA256)の表示などで、バイナリデータ(byte[])を可読性のある16進数文字列に変換する実装です。 .NETの標準メソッドを使用した一括変換と、可読性を高めるための整形出力(スペース区切りや改行)の両方を解説します。
仕様(入出力)
- 入力
- 任意のバイト配列(
byte[])
- 任意のバイト配列(
- 出力
- 16進数表記された文字列(例:
4A30...) - 用途に応じて、区切り文字(スペース、ハイフン)や改行を含める
- 16進数表記された文字列(例:
- 前提
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は大文字(A〜F)、x2は小文字(a〜f)を出力します。
- フォーマット指定子
- 区切り文字の変更
BitConverter.ToStringはデフォルトでハイフン-で区切りますが、これをReplaceで削除したり、コロン:に置換してMACアドレス風に表現したりできます。
- StringBuilderの活用
- ループ内で
Console.Writeを繰り返すと遅くなるため、大量のデータを扱う場合はStringBuilderに溜め込んでから出力してください。
- ループ内で
注意点
- メモリ使用量
- 1バイトのデータは16進数文字列にすると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 が最も効率的かつ記述が短く済みます。一方、デバッグ用途で見やすく整形したい場合や、古いフレームワークで動作させる必要がある場合は、BitConverter や StringBuilder を用いたループ処理を組み合わせて対応してください。
