C#でバイト型配列 byte[]型から string型に変換するコードと実行結果を紹介します。
バイト型配列 byte[]から文字列(string)型に変換する場合、多くの場合byte配列にはShift JISの文字コードで文字列データが格納されています。C#(.NET Framework)ではstring型の文字列はunicodeで扱われるため、単純にbyte配列のデータをstring型にコピーしても文字コードが違うため同じ文字列として扱えません。
byte配列からstring型に変換するためには、文字コードの変換も含めて変換処理をする必要があります。
C#では System.Text.Encodingクラスを利用することで、文字コードのエンコードを含めてbyte[]型から文字列型への変換ができます。
byte配列からstring型に変換するには EncodingオブジェクトのGetString()メソッドを利用します。
private void button1_Click(object sender, EventArgs e)
{
byte[] data;
data = GetData(); //何らかのbyte[]データを取得
//ASCII エンコード
string text = System.Text.Encoding.ASCII.GetString(data);
//データがShift-JISの場合
//string text = System.Text.Encoding.GetEncoding("shift_jis").GetString(data);
//データがEUCの場合
//string text = System.Text.Encoding.GetEncoding("euc-jp").GetString(data);
//データがunicodeの場合
//string text = System.Text.Encoding.Unicode.GetString(data);
//データがutf-8の場合
//string text = System.Text.Encoding.UTF8.GetString(data);
//表示
label1.Text=text;
}
Windows Formアプリケーションを作成し、下図のUIを作成します。TextBox2つ、Buttonを1つフォームに配置します。
下記のコードを記述します。
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;
namespace StringConvertArray
{
public partial class FormArrayToString : Form
{
public FormArrayToString()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string input = textBox1.Text;
string[] bytestr = input.Split(',');
byte[] data = new byte[bytestr.Length];
for (int i = 0; i < bytestr.Length; i++) {
data[i] = Convert.ToByte(bytestr[i],16);
}
string text = Encoding.GetEncoding("shift_jis").GetString(data);
textBox2.Text = text;
}
}
}
下記のコードにより、textbox1 に入力された文字列をinput変数に格納し、"," で区切り文字列の配列にします。あわせて、data配列を宣言し、配列長をカンマで区切られた文字列配列と同じ長さにします。
string input = textBox1.Text;
string[] bytestr = input.Split(',');
byte[] data = new byte[bytestr.Length];
が入力された場合
となります。
続いて、forループにより、bytestr配列のそれぞれの要素の文字列を数値(byte型)に変換します。変換した値をdata配列に代入します。
for (int i = 0; i < bytestr.Length; i++) {
data[i] = Convert.ToByte(bytestr[i],16);
}
となります。ここまでで入力用データのbyte型配列が準備できました。
GetEncoding()メソッドを呼び出し、エンコーディングオブジェクトを取得します。今回は"shift_jis"を与えることでSJISのエンコーディングオブジェクトを取得しています。取得したエンコーディングオブジェクトのGetString()メソッドを呼び出し、文字列に変換します。GetString()メソッドの第一引数に変換元のバイト配列を与えます。変換結果はメソッドの戻り値として返ります。
string text = Encoding.GetEncoding("shift_jis").GetString(data);
Encoding sjenc = Encoding.GetEncoding("shift_jis");
string text = sjenc.GetString(data);
textBox2.Text = text;
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスに、"44,75,63,6B,82,CD,83,41,83,71,83,8B" を入力します。
[button1]をクリックします。上部のテキストボックスに入力したカンマ区切りの値の文字コードの文字「Duckはアヒル」が下部のテキストボックスに表示されます。
入力する値を変更します。
上部のテキストボックスに、"43,23,20,50,72,6F,67,72,61,6D,6D,69,6E,67" を入力します。
[button1]をクリックします。上部のテキストボックスに入力したカンマ区切りの値の文字コードの文字「C# Programming」が下部のテキストボックスに表示されます。