PG日誌

各記事はブラウザの横幅を1410px以上にすると2カラムの見出しが表示されます。なるべく横に広げてみてください。

【C#】16進数文字列とバイト配列の相互変換

ちょっと何の役に立つか分からないですが、16進数の文字列をバイトの配列に見た目通りに変換する方法です。

long型などの有限長の型を経由しないため基本的に無限長の長さをそのまま扱えます。

変換方法のサンプル

以下のように確実に16進数文字列と分かっているものを対象に16進数文字列 ⇔ バイト配列を相互に変換できます。

public static void Main(string[] args)
{
    // 元の16進数表記の文字列
    string dexStr = "0x1234567890ABCDEF";

    // バイト配列に変換
    byte[] array = DexConverter.Convert(dexStr);
    // > array = 0x12 34 56 78 90 ab cd ef

    // バイト配列から16進数文字列に変換
    string conv = DexConverter.Convert(array);
    // > conv = 1234567890abcdef
}

DexConverterクラス

上記のサンプルで使用しているクラスの実装です。

おそらく変換効率がかなり悪いと思われるのでプロジェクトで使用するときは修正が必要かもしれません。

// DexConverter.cs

using System;
using System.Text;

/// <summary>
/// 16進数を変換するための機能を提供します。
/// </summary>
public static class DexConverter
{
    /// <summary>
    /// 16進数文字列をバイト配列に変換します。
    /// </summary>
    public static byte[] Convert(string dex)
    {
        if (dex.Length % 2 != 0)
        {
            throw new ArgumentException("Invalid length.");
        }

        // 先頭の '0x' を取り除く
        dex = dex.TrimStart('0').TrimStart('x').Trim('X');

        byte[] array = new byte[dex.Length / 2];
        for (int i = 0; i < dex.Length; i += 2)
        {
            string bstr = dex.Substring(i, 2);
            array[i / 2] = System.Convert.ToByte(bstr, 16);
        }

        return array;
    }

    /// <summary>
    /// バイト配列を16進数の文字列に
    /// </summary>
    public static string Convert(byte[] array)
    {
        var builder = new StringBuilder();
        foreach (byte b in array)
        {
            string bstr = b.ToString("x");
            if (bstr.Length == 1)
            {
                builder.Append("0"); // 1桁の時は上位ビットをうめる
            }
            builder.Append(b.ToString("x"));
        }

        return builder.ToString();
    }
}