備忘録

備忘録

C# 16進数文字列をbyte[]に変換する方法

Ⅰ. はじめに

タイトルの通り「16進数文字列をbyte[]に変換する方法」です。

Ⅲ. 16進数文字列→byte[]

Main.cs

static void Main(string[] args)
{
  byte[] bytes = "01 02 03".ToByteArray();
  // byte[] bytes = "0x010203".ToByteArray();
  // byte[] bytes = "010203".ToByteArray();
  // byte[] bytes = "0x01, 0x02, 0x03".ToByteArray();
  // byte[] bytes = "0x01 0x02 0x03".ToByteArray();
  // IEnumerable<byte> bytes = "01 02 03".ToByteSequence();
}

StringExtensions.cs

public static class StringExtensions
{
  public static IEnumerable<byte> ToByteSequence(this string source)
  {
    var sb = new StringBuilder(source);

    // "0x00, 0x01, 0x02" -> "00 01 02"
    // "0x000102" -> "000102"
    // "00 01 02" -> "000102"
    var str = sb
      .Replace("0x", "")
      .Replace(",", "")
      .Replace(" ", "")
      .ToString();

    for (int i = 0; i < str.Length / 2; i++)
    {
      yield return Convert.ToByte(str.Substring(i * 2, 2), 16);
    }
  }

  public static byte[] ToByteArray(this string source)
    => ToByteSequence(source).ToArray();
}

Ⅳ. byte[] → 16進数文字列

var bytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
Console.WriteLine(BitConverter.ToString(bytes));
// 00-01-02-03-04-05

Console.WriteLine(BitConverter.ToString(bytes).Replace("-", ""));
// 000102030405

Console.WriteLine($"0x{string.Join(" 0x", BitConverter.ToString(bytes).Split("-"))}");
// 0x00 0x01 0x02 0x03 0x04 0x05

// .NET 5以上
Console.WriteLine(Convert.ToHexString(bytes));
// 000102030405