概要
- 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進数表記であるかのチェックを行っています。