Home > Programming | Study > [C#] Int を byte[] に分解する

[C#] Int を byte[] に分解する

たとえば、Color.ToArgb() で返ってくる整数値(AARRGGBB の32ビット)を成分ごとにばらしたい場合などなど。

シフト演算をしてもよいが、私のような文系人間には少しつらい。ちょうどいいことに、.NET には専用のコンバータークラスがあるのでそれを利用すればいい。

BitConverter はさまざまな型の変数を、バイト配列に変換してくれる。
たとえば、.GetBytes() に整数値を渡せば、byte を4つ格納した配列を返す。

Int32 i = /* 何らかの整数値 */;

byte[] b = BitConverter.GetBytes(i);
label1.Text = string.Format(
	"{0:X2}-{1:X2}-{2:X2}-{3:X2}",
	b[0], b[1], b[2], b[3]);

出力結果は、 C0-AA-F2-87 とかそんな感じになるはず。

シフト演算より面倒くさくなくていいかも。

label2.Text = string.Format(
	"{0:X2}-{1:X2}-{2:X2}-{3:X2}",
	(byte)( i        & 0x000000FF),
	(byte)((i >>  8) & 0x000000FF),
	(byte)((i >> 16) & 0x000000FF),
	(byte)((i >> 24) & 0x000000FF));

Delphi(とかC/C++) だったら、構造体を宣言して強引にキャストするのがスマートかな。C# でもそうなのかな。でも、なんとなく感覚的な問題だが、あまりそういうことはしたくないな。

  • あら、そこにつながるとはw

    ちょっと違うかもしれませんが、そのエントリーの問題のキモは、
    COLORREF 構造体にあるのかもしれません。

    Win32 API で色を扱う場合、COLORREF を利用することになりますが、その構造は .NET(GDI+?) のCOLOR型とはちと違うようです。

    [Win32 Color] COLORREF: 0xFFBBGGRR
    [GDI+ Color] Color.ToARGB(): 0xAARRGGBB

    その差異を埋める ColorTranslator というクラスもあるらしいですが、あんまり使わないのでよくは知りません。

    ※あっちのエントリーにコメントをつけようかと思ったのですが、適当な誤った情報で汚してもいけないと思い、こちらに書きました。済みませぬ。
  • shiroica
    早速参考に書き直してみました!
    http://blog.sharplab.net/compu...
    便利ですね~。勉強になりました。
blog comments powered by Disqus

Home > Programming | Study > [C#] Int を byte[] に分解する

My Friend Feed

http://friendfeed.com/daruyanagi

Google Analyticator

615
 Unique Visitors 
 (1 day) 
Powered By Google Analytics

Return to page top