バイナリファイルへの書き込みや通信などの用途で、文字列からバイト型配列 byte[]に変換したいことがあります。この記事では文字列からバイト型配列(byte[])への変換コードを紹介します。
C#では文字列はunicodeとして定義されているため、文字列をbyte[]配列にコピーするためには、エンコードの指定(SJIS, JIS, EUC, UTF-8など)も必要になります。C#では System.Text.Encodingクラスが用意されており、このクラスを用いて文字列をエンコードを指定して、byte[]配列型に変換できます。
文字列(string)型からbyte[]配列型に変換する場合はGetBytes()メソッドを用います。
private void button1_Click(object sender, EventArgs e)
{
string text = "文字列";
//ASCII エンコード
byte[] data = System.Text.Encoding.ASCII.GetBytes(text);
//データがShift-JISの場合
//byte[] data = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(text);
//データがEUCの場合
//byte[] data = System.Text.Encoding.GetEncoding("euc-jp").GetBytes(text);
//データがunicodeの場合
//byte[] data = System.Text.Encoding.Unicode.GetBytes(text);
//データがutf-8の場合
//byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
//何かしらの処理
WirteBinaryData(data);
}
下図のUIを作成します。TextBoxとButtonを配置します。
下記のコードを記述します。
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.Text;
namespace StringConvertArray
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str = "しろくまABC";
byte[] data = Encoding.GetEncoding("shift_jis").GetBytes(str);
for (int i = 0; i < data.Length; i++) {
textBox1.Text += Convert.ToString(data[i],16) + " - ";
}
}
}
}
ボタンをクリックすると"しろくまABC"という文字列をShift-JISでエンコードしてバイト配列に変換します。
変換後、バイト配列の内容を16進数表記でテキストボックスに表示します。
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。"しろくまABC"の文字列をShift-JISで記述した各バイトの値がテキストボックスに表示されます。
文字とバイトの数値との対応は下記のとおりです。
上記のプログラムではエンコードをShift-JISにしましたが、エンコードの指定を変更すると結果も変わります。
以下はエンコードをUTF-8にした場合のコードとその結果です。
private void button1_Click(object sender, EventArgs e)
{
string str = "しろくまABC";
byte[] data = Encoding.UTF8.GetBytes(str);
for (int i = 0; i < data.Length; i++) {
textBox1.Text += Convert.ToString(data[i],16) + " - ";
}
}
ネットワーク通信での利用の際は、先にASCII文字のみにエンコードされることもあるため、
byte[] data = Encoding.ASCII.GetBytes(str);
が使われます。(全角文字が含まれない場合も上記です。)
または、JISエンコード(iso-2022-jp)が使われるケースもあります。
byte[] data = Encoding.GetEncoding("iso-2022-jp").GetBytes(str);