16進数表現された文字列をバイト型配列 byte[]型に変換する - C#

16進数表現された文字列をバイト型配列 byte[]型に変換するコードを紹介します。

概要

16進数表現された文字列をバイト型配列 byte[]型に変換するには、ConvertクラスのToByteメソッドを利用する方法と、byteオブジェクトのParseメソッドを利用する方法があります。メソッドは与えられた文字列を数値に変換する処理のみのため、入力文字列から桁数分の文字列を抜き出す処理はプログラム側で実装する必要があります。

プログラム例 : Convertクラスを利用する場合

UI

Windows Formアプリケーションを作成し、下図のUIを作成します。フォームにテキストボックス2つボタンを1つ配置します。

コード

下記のコードを記述します。button1のClickイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Globalization;


namespace HexStringAndByteArray
{
  public partial class FormHexStringToByteArray : Form
  {
    public FormHexStringToByteArray()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string input = textBox1.Text;
      byte[] result = new byte[input.Length/2];

      int cur = 0;

      for (int i = 0; i < input.Length; i=i+2) {
        string w = input.Substring(i, 2);
        result[cur] = Convert.ToByte(w,16);
        cur++;  
      }

      for (int j = 0; j < result.Length; j++) {
        textBox2.Text += result[j].ToString("X2")+"\r\n";
      }
    }
  }
}

解説

16進表記の文字列を数値に変換しbyte配列に代入します。16進表記の文字列の数値への変換には ConvertクラスのToByte()メソッドを利用します。ToByteメソッドに与える引数は16進表記された文字列を与えます。文字列の桁数に関しては今回の例では2桁で想定していますので、入力文字列を2文字ずつコピーし数値へ変換します。
数値(byte型)への変換にはConvertクラスのToByte()メソッドを利用します。第一引数には変換する文字列を与えます。第二引数には変換する文字列の基数を与えます。今回は16進数表現された文字列を入力して変換するため、第二引数の値は"16"を与えます。
  int cur = 0;

  for (int i = 0; i < input.Length; i=i+2) {
    string w = input.Substring(i, 2);
    result[cur] = Convert.ToByte(w,16);
    cur++;  
  }

変換されたbyte配列の値を確認するため、ループでbyte配列の値を1つずつ数値から文字列に変換して画面に表示します。
  for (int j = 0; j < result.Length; j++) {
    textBox2.Text += result[j].ToString("X2")+"\r\n";
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに文字列を入力します。文字列は16進表記の文字列とするため、0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F の文字のみを利用した文字列とします。また2桁区切りの16進表記の文字列を想定しているため、入力文字列の文字数は偶数文字とします。


文字列入力後、[Exec]ボタンをクリックします。16進表記の文字列を数値に変換したbyte配列の値が下部のテキストボックスに表示されます。入力文字列と同じ値になっており正しく変換できていることが確認できます。

プログラム例 : byte.Parse を利用する場合

UI

下図のUIを作成します。テキストボックス2つボタンを2つ配置します。(button1 (Execボタン) は今回は利用しません。)

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Globalization;


namespace HexStringAndByteArray
{
  public partial class FormHexStringToByteArray : Form
  {
    public FormHexStringToByteArray()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string input = textBox1.Text;
      byte[] result = new byte[input.Length / 2];

      int cur = 0;

      for (int i = 0; i < input.Length; i = i + 2) {
        string w = input.Substring(i, 2);
        result[cur] = byte.Parse(w,System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture);

        //引数が2つのものでも可
        //result[cur] = byte.Parse(w, System.Globalization.NumberStyles.HexNumber);
        cur++;
      }

      for (int j = 0; j < result.Length; j++) {
        textBox2.Text += result[j].ToString("X2") + "\r\n";
      }
    }
  }
}

解説

16進表記の文字列を数値に変換しbyte配列に代入します。16進表記の文字列の数値への変換には byteオブジェクトのParseメソッドを利用します。16進数表記の文字列のbyteへの変換のため、Parseメソッドの第二引数には"HexNumber"を与えます。また、16進数表記の文字列はカルチャには依存しないため、Parseメソッドの第三引数には "InvariantCulture" を与えます。また、現在のカルチャでの変換でも問題ないため、Parseメソッドは引数が2つのものを利用しても正しく動作します。
文字列の桁数に関しては今回の例では2桁で想定していますので、入力文字列を2文字ずつコピーし数値へ変換します。
  int cur = 0;

  for (int i = 0; i < input.Length; i = i + 2) {
    string w = input.Substring(i, 2);
    result[cur] = byte.Parse(w,System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture);
    cur++;
  }

変換されたbyte配列の値を確認するため、ループでbyte配列の値を1つずつ数値から文字列に変換して画面に表示します。
  for (int j = 0; j < result.Length; j++) {
    textBox2.Text += result[j].ToString("X2")+"\r\n";
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに16進数表記の文字列を入力します。文字数は偶数文字にします。


入力後[Exec2]ボタンをクリックします。16進表記の文字列を数値に変換したbyte配列の値が下部のテキストボックスに表示されます。入力文字列と同じ値になっており正しく変換できていることが確認できます。

参考

逆の変換になる、バイト型配列 byte[]型を16進数表現された文字列に変換するコードはこちらの記事を参照してください。
また、16進数表現された文字列ではなく、キャラクターコードの値でbyte[]配列に変換する場合はこちらの記事を参照してください。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2017-11-16
作成日: 2017-11-07
iPentec all rights reserverd.