NULL(\0)終端文字列を文字列に変換する (NULL終端char[]文字列のトリミング) - C#

C#では \0を含むchar[]をstringに変換した場合でも\0はそのまま変換されます。また、\0は終端として扱われません。そのため、char[]文字列をstringに変換する場合null文字のトリミングもする必要があります。null文字をトリミングするためには、Trim(), TrimEnd(), TrimStart()等の関数にトリミング文字セットとして'\0'を与えることでNULL文字の削除ができます。

コード例

char[] ReceiveData = new char[8];

ReceiveData = ReceiveDataSommething();
/*
 ReceiveData = ['+','O','K','\0','\0','\0','\0','\0'];
 となったとする
*/

string str = System.Text.Encoding.ASCII.GetString(ReceiveData);
/*
  この段階では
  str='+OK\0\0\0\0\0';
*/

str = str.TrimEnd('\0');
/*
  ここでは
  str='+OK';
  となる
*/

/*
//改行コードなども含めて、複数の文字を対象にする場合
char[] dic = {'\0','\r','\n','\t'};
str = str.TrimEnd(dic);
*/

textBox1.Text += str;

サンプルプログラム

UI

下図のUIを作成します。テキストボックスとボタンを2つ配置します。

コード

下記のコードを記述します。
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 NullTerminateStringTrim
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      char[] ArrayData = new char[16];
      ArrayData[0] = 'P';
      ArrayData[1] = 'e';
      ArrayData[2] = 'n';
      ArrayData[3] = 'g';
      ArrayData[4] = 'u';
      ArrayData[5] = 'i';
      ArrayData[6] = 'n';
      ArrayData[7] = '\0';
      ArrayData[8] = '\0';
      ArrayData[9] = '\0';
      ArrayData[10] = '\0';
      ArrayData[11] = '\0';
      ArrayData[12] = '\0';
      ArrayData[13] = '\0';
      ArrayData[14] = '\0';
      ArrayData[15] = '\0';

      string str = new string(ArrayData);
      textBox1.Text += str+"\r\n"+"処理終了";
    }

    private void button2_Click(object sender, EventArgs e)
    {
      char[] ArrayData = new char[16];
      ArrayData[0] = 'P';
      ArrayData[1] = 'e';
      ArrayData[2] = 'n';
      ArrayData[3] = 'g';
      ArrayData[4] = 'u';
      ArrayData[5] = 'i';
      ArrayData[6] = 'n';
      ArrayData[7] = '\0';
      ArrayData[8] = '\0';
      ArrayData[9] = '\0';
      ArrayData[10] = '\0';
      ArrayData[11] = '\0';
      ArrayData[12] = '\0';
      ArrayData[13] = '\0';
      ArrayData[14] = '\0';
      ArrayData[15] = '\0';

      string str = new string(ArrayData);
      str = str.Trim('\0');
      textBox1.Text += str + "\r\n" + "処理終了";
    }
  }
}

解説

下記のコードは固定長のchar配列を作成し、文字を代入しています。文字列の末尾以降の要素にはヌル"\0"を代入しています。
  char[] ArrayData = new char[16];
  ArrayData[0] = 'P';
  ArrayData[1] = 'e';
  ArrayData[2] = 'n';
  ArrayData[3] = 'g';
  ArrayData[4] = 'u';
  ArrayData[5] = 'i';
  ArrayData[6] = 'n';
  ArrayData[7] = '\0';
  ArrayData[8] = '\0';
  ArrayData[9] = '\0';
  ArrayData[10] = '\0';
  ArrayData[11] = '\0';
  ArrayData[12] = '\0';
  ArrayData[13] = '\0';
  ArrayData[14] = '\0';
  ArrayData[15] = '\0';
button1のクリック時の動作
  string str = new string(ArrayData);
  textBox1.Text += str+"\r\n"+"処理終了";
stringオブジェクトのコンストラクタの引数にchar[]を与えることでchar[]文字列をstringに変換しています。ただしPenguinの後ろの"\0"により文字列の終了となっているため、変換したstringオブジェクトのstrの後ろに改行コード"\r\n"や"処理終了"の文字列を結合しても文字の終わりより後ろにあるデータとみなされテキストボックスには表示されません。
button2のクリック時の動作
  string str = new string(ArrayData);
  str = str.Trim('\0');
  textBox1.Text += str + "\r\n" + "処理終了";
button2の場合もbutton1と同様にstringオブジェクトのコンストラクタの引数にchar[]を与えることでchar[]文字列をstringに変換しますが、変換後に str.Trim('\0'); によりヌル0の文字列を削除しています。この処理により次行でstrの後に改行コードや"処理終了"の文字列を結合すると結合した文字列全体がテキストボックスに表示されます。

実行結果

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


[button1]をクリックします。テキストボックスには"Penguin"の文字のみが表示されます。


テキストボックスの内容をクリアし、[button2]をクリックします。テキストボックスには"Penguin"の文字列と"処理終了"の文字列が表示されます。

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