C# – 16進数文字列とbyte型配列の相互変換

概要

  • 16進数表記の文字列からbyte型配列への変換
  • byte型配列から16進数表記の文字列への変換

実装例

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;

namespace BinaryEditorBase
{
    public static class BinaryEditor
    {
        /// <summary>
        /// バイト列を16進数表記の文字列に変換
        /// </summary>
        /// <param name="bytes">バイト列</param>
        /// <returns>16進数表記文字列</returns>
        public static string BytesToHexString(byte[] bytes)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                sb.Append(bytes[i].ToString("X2"));
            }
            return sb.ToString();
        }

        /// <summary>
        /// 16進数表記の文字列をバイト列に変換
        /// </summary>
        /// <param name="byteString">16進数表記文字列</param>
        /// <returns>バイト列</returns>
        public static byte[] HexStringToBytes(string byteString)
        {
            // 文字列の文字数(半角)が奇数の場合、頭に「0」を付ける
            int length = byteString.Length;
            if (length % 2 == 1)
            {
                byteString = "0" + byteString;
                length++;
            }
            List<byte> data = new List<byte>();
            for (int i = 0; i < length - 1; i = i + 2)
            {
                // 16進数表記の文字列かどうかをチェック
                string buf = byteString.Substring(i, 2);
                if (Regex.IsMatch(buf, @"^[0-9a-fA-F]{2}$"))
                {
                    data.Add(Convert.ToByte(buf, 16));
                }
                // // 16進数表記で無ければ「00」とする
                else
                {
                    data.Add(Convert.ToByte("00", 16));
                }
            }
            return data.ToArray(); ;
        }
        [STAThread]
        static void Main()
        {
            try
            {
                // 16進数表示の文字列
                string hexData1 = "102030A0B0C";
                // 「byte[]」配列へ変換
                byte[] bytesData1 = BinaryEditor.HexStringToBytes(hexData1);
                // string型文字列へ変換
                string hexData2 = BinaryEditor.BytesToHexString(bytesData1);
                // 表示
                Console.WriteLine(hexData2);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            // 終了処理
            Console.Write("何かキーを押してください");
            Console.Read();
        }
    }
}

説明

(12行目) これは特に問題ないと思います。byte型配列から1つずつ値を取り出して文字列に変換するだけです。

(23行目) 文字列からの変換は少し面倒です。基本は頭から2文字ずつ取得し、byte型に変換、配列に格納、といった流れです。 上記サンプルでは文字列の文字数が奇数だった場合の調整、及び文字列が16進数表記であるかのチェックを行っています。