- - PR -
byte[]→stringへの代入について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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に追加書きすればいいかと考えたまでは良かったのです が、記述の仕方が判らなく質問させて頂く次第です。 何卒ご教示頂ければ幸いです。 | ||||||||
|
投稿日時: 2004-10-20 13:15
単純に1バイト文字から2バイト文字への変換を行っているのであれば、
Microsoft.VisualBasic.Strings.StrConv(Hoge, Microsoft.VisualBasic.VbStrConv.Wide, 0) でいいのではないかと思ったのですが… | ||||||||
|
投稿日時: 2004-10-20 13:45
にしざきさん、ありがとうございます。
ランタイムやWIN32APIは避けたいのです。。。 | ||||||||
|
投稿日時: 2004-10-20 13:57
であれば、元の文字列全体をバイト列にせず、
でどうでしょう。 | ||||||||
|
投稿日時: 2004-10-20 15:50
にしざきさん、レスありがとうございます。
おおお!こういうやり方があるのですね!!! 勉強させて頂きます。ありがとうございます。 | ||||||||
|
投稿日時: 2004-10-20 15:55
スマートでないため誰も参考にしないと思いますが、一応?※印の部分が分かったので
参考までに string str = GetEncoding("Shift_JIS").GetString(byte,i,2); HogeHogeHoo=HogeHogeHoo+str; if(i+1<5) i++; にてできました。 しかし。。我ながら、なんとバタくさい。。。 | ||||||||
|
投稿日時: 2004-10-20 20:30
半角⇔全角の問題は色々やり方がありますね。
どういう意味で「ランタイム」といっているのかわかりませんが、 Microsoft.VisualBasic.〜は.NETのモジュールなので私は躊躇せず使っちゃいます これまた冗長な記述になってしまいますが str = str.Replace("0","0"); str = str.Replace("1","1"); ・ ・ とか。これをメソッドにすれば使い勝手はいいはずですし。 | ||||||||
|
投稿日時: 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] + 半角数字と全角数字のコード値のオフセット値; } のほうが、高速化できるような気もします。 |