- PR -

byte[]→stringへの代入について

投稿者投稿内容
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-10-20 12:04
脳味噌筋肉です。

string型の変数Hogeに”123”(1は半角、23は全角)というデータが格納されるとして
これを1バイトずつ切り出し、半角の1〜0なら全角に置き換える、全角なら置き換えない、と
いう処理を経て、最終的に”123”(すべて全角)の文字列を作成したい・・とします。

まずbyte[]配列に展開
byte [] byte = GetEncoding("Shift_JIS").GetBytes(Hoge);
string HogeHogeHoo;
これをHogeの長さぶん走査して半角を全角に置き換えます
for(int i=0; i<5; i++)
{
if(byte[i]==49)
HogeHogeHoo=HogeHogeHoo+"1";
else if(byte[i]==50)
HogeHogeHoo=HogeHogeHoo+"2";
・・・
else
{
///※※※
}
}

※のタイミングで元の文字列Hogeの全角文字をHogeHogeHooに追加書きしたいのですが
ここで詰まっています。
この場合、※のタイミングで得られるiの値は全角文字の1バイトめであると判断してその
場所から2バイトぶんHogeHogeHooに追加書きすればいいかと考えたまでは良かったのです
が、記述の仕方が判らなく質問させて頂く次第です。

何卒ご教示頂ければ幸いです。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-10-20 13:15
単純に1バイト文字から2バイト文字への変換を行っているのであれば、
Microsoft.VisualBasic.Strings.StrConv(Hoge, Microsoft.VisualBasic.VbStrConv.Wide, 0)
でいいのではないかと思ったのですが…
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-10-20 13:45
にしざきさん、ありがとうございます。

引用:

にしざきさんの書き込み (2004-10-20 13:15) より:
単純に1バイト文字から2バイト文字への変換を行っているのであれば、
Microsoft.VisualBasic.Strings.StrConv(Hoge, Microsoft.VisualBasic.VbStrConv.Wide, 0)
でいいのではないかと思ったのですが…




ランタイムやWIN32APIは避けたいのです。。。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-10-20 13:57
であれば、元の文字列全体をバイト列にせず、
コード:
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(char c in Hoge) {
  switch(c) {
    case '0': sb.Append('0'); break;
    case '1': sb.Append('1'); break;
    ...
    default: sb.Append(c); break;
  }
}
return sb.ToString();


でどうでしょう。
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-10-20 15:50
にしざきさん、レスありがとうございます。

引用:

にしざきさんの書き込み (2004-10-20 13:57) より:
であれば、元の文字列全体をバイト列にせず、
コード:
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(char c in Hoge) {
  switch(c) {
    case '0': sb.Append('0'); break;
    case '1': sb.Append('1'); break;
    ...
    default: sb.Append(c); break;
  }
}
return sb.ToString();


でどうでしょう。



おおお!こういうやり方があるのですね!!!
勉強させて頂きます。ありがとうございます。
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-10-20 15:55
スマートでないため誰も参考にしないと思いますが、一応?※印の部分が分かったので
参考までに

string str = GetEncoding("Shift_JIS").GetString(byte,i,2);
HogeHogeHoo=HogeHogeHoo+str;
if(i+1<5)
i++;

にてできました。

しかし。。我ながら、なんとバタくさい。。。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-10-20 20:30
半角⇔全角の問題は色々やり方がありますね。

どういう意味で「ランタイム」といっているのかわかりませんが、
Microsoft.VisualBasic.〜は.NETのモジュールなので私は躊躇せず使っちゃいます

これまた冗長な記述になってしまいますが
str = str.Replace("0","0");
str = str.Replace("1","1");


とか。これをメソッドにすれば使い勝手はいいはずですし。
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2004-10-20 21:19
アルゴリズムだけの問題であり、
結局MSILが最適化してくれるかもしれませんが、

if (byte[i]==49)
else if
else if
とか
switch
で分岐するよりも

条件判定を1回だけにして、
if ( byte[i]>=49 && byte[i]< 59 )
{
str = str + (char) ( byte[i] + 半角数字と全角数字のコード値のオフセット値;
}

のほうが、高速化できるような気もします。

スキルアップ/キャリアアップ(JOB@IT)