不慣れでもMSDN検索

今回はちょっと違うトピック。
前回の記事に初コメントが付いた。
 
で、お勉強サイトや書籍を見るばかりでなく、自分でコーディングをする作業をしてみる良い機会に恵まれた。
「String型のObjectをbyte型の一次配列に変換する」という単純な処理。
3分で出来るかと思いきや、世の中そんなに甘くない。
30分ぐらい調べて試して。
C#プログラミングに慣れていれば、一発でわかるであろう内容だと思いながらも良い勉強になった。
 
さて、調査経緯などを紹介してみれば、私同様 .NET でのプログラミングに不慣れな方への参考になるかと思った次第。
まずは、こんなプログラムを書いてみた。
 

string sampleString = "test";
byte[] sampleByte = new byte[100];

sampleByte = sampleString.ToCharArray();
Console.WriteLine(sampleByte);

 
コンパイルエラー。
型 'char[ ]' を型 'byte[ ]' に暗黙的に変換できません。
 
byteとcharは共に1byte固定だから暗黙変換できるかと思ったら、そう甘くはなかった。
C#ではプリミティブな型は内部的に、構造体として定義されており、各種インターフェースも継承している。
単純に変換出来てはいけないのだ。
 
もちろん次は sampleByte = (byte)sampleString.ToCharArray(); にしてみた(笑
同じエラーであえなく撃沈。
 
そこで System.String や、System.Array のMSDNヘルプを見てみる。
「.NET の開発」→「.NET Framework SDK ドキュメント」→「クラス ライブラリ リファレンス」
ココをまず第一に見ることにしている。
 
キレイに一発で出来る方法ないかなぁ、と思って探すもそれらしきモノが見つからない。
まずは String 型の任意1byteを byte 型にキャスト出来ないといけない気がしてきた。
この段階で、byte数分ループする処理になるのは致し方ないのかと、半分ガッカリしたり。
 
とはいえ、そういう思惑で探すと、System.String メソッドの「明示的インターフェイスの実装」の中に良いモノを発見。
String.System.IConvertible.ToByte だ。
これがある、ということは Convert 対象である、ということ。
 
すかさず Convert クラスを検索。
それまでは String か Array にうまい一発変換がないかと探していた。
(ToByteArray みたいなのが欲しかった
 
Convert.ToByte メソッドを発見。
String はプロパティに Length と Chars を持っている。
更に String オブジェクトは
のオーバーロードにより、仮に String str とすると、str[0] のような形式でアクセスが可能であることはこれまでのお勉強で知っていた。
となると、Length 分ループして、1byteずつ byte に突っ込むのが正攻法かと考える。
あとは、byte
変数 sampleByte を固定100byteで領域確保していたのが気に食わなかったので、sampleString.Length 分確保するようにすれば完成。
 

string sampleString = "test";
byte[] sampleByte = new byte[sampleString.Length+1];
for (int i = 0; i < sampleString.Length; i++){
	sampleByte[i] = Convert.ToByte(sampleString[i]);
	Console.WriteLine(sampleByte[i]);
}

 
sampleByte の領域を sampleString.Length“+1” にしたのはあまり気にしなくて良い。
“+1”しなくても問題なく動作する。
C言語時代の char 配列領域を確保する時に、\0(NULL)用に1byte多めに確保するクセ。
 
また、for(){} を抜けた後に Console.WriteLine(sampleByte); と、していたが、出力は「System.Byte[]」となる。
(各値を出力しようとしてコレをやったのでやや恥ずかしい
 
やってみればわかるが、"test" を byte ごとに出力すると「116 101 115 116」となる。
言わずもがな、文字コードの値だ。
エンコードが変われば、サイズも値も変わってくるが、そこまではしていない。
 
大した手法は何一つ使っていないが、やりたいことをやるための検索手段として初歩の手順を踏んだ気がしたので、紹介しておこうと思ったまで。
熟練度の高いエンジニアの皆様にはクドイ話かもしれない。