文字列を16進数の値にする

Last-modified: 2007-10-21 (日) 22:39:53

概要

 0~Fまでで構成された文字列を、16進数として認識し、値を返す関数を作ってみます。
 始めに書いておきますが、普通に16進数を使いたいのであれば、数字の前に0xを置くことでその数字を16進数と認識してくれます。

// ソース 例
int nX = 0xFFFF;
N(nX);
A;
// 出力 例
65535

 なのでこの関数はほとんど意味がありません。プレイヤーに16進数の文字を打ち込ませてそれを認識するとかいった奇特な使い方しか、用途がないと思われます。(応用次第で16進数以上にできますけど……)
 今回はちょっと長いです。

 
int Nibble(string szA)
{
  int     nR  = 0; //リターン用
  int     nC  = szA.Length(); //ループの最後 + 十六乗用
  string  szX;     //一文字格納用
  int     nX;      //一文字の数値算出用
  int     nL  = 0; //ループ用
  for( ; nL<nC ; )
  {
    szX = szA.GetPart(nL,1);
    //-----------------------------------------------------------
    nX = szX.Int();
    if(nX == 0)
    {	//if(szX != "0"){	nX = szX[0] - 55;}  こういうやり方でもできます
       if(szX == "A"){nX = 10;}
       if(szX == "B"){nX = 11;}
       if(szX == "C"){nX = 12;}
       if(szX == "D"){nX = 13;}
       if(szX == "E"){nX = 14;}
       if(szX == "F"){nX = 15;}
    }//-----------------1文字だけを16進数に
    nR += nX * Math.Pow(16,(nC -1) - nL);
    ++nL;
  }
  return nR;
}

作ったら動かしてみましょう。

void game_main(void)
{
  int nX = Nibble("FFFF"); A;
  N(nX);A;
}

解説

 文字列のケタを読み込み、ケタごとに16の(ケタ-1)乗をかけていき、それをnRに足していきます。
 (たとえば"100"なら、3ケタなので、
 1 x ( 16^2 = 256)= 256 
 0 x ( 16^1 = 16)= 0
 0 x ( 16^0 = 1) = 0

 となります。よって、"100"には 256 + 0 + 0 つまり256が返ります。

 
 
 
 
 

おまけ

 16進数で思い浮かぶのはhtmlなどの色の書式でしょうか。(「#FF0000」みたいなやつです)
 普通、system4.0で色を扱う場合は、引数3つでの指定となりますが、一応色用の構造体型もSACT2に用意されていることはいるのです。
 今回はこの構造体型で宣言される構造体変数に"#xxxxxx"の文字列で色を取得させる関数を作ってみます。

 

 構造体型名は、「rgb_t」で、メンバーは「int r」「int g」「int b」の三つ。
 メソッドにvoid setがあります。(これ使えばこの関数は必要ないと思います。#に拘るなら別ですが)

 

 とりあえずこの構造体を使って色指定できるようなSP_CREATEを作ってみます。

void SP_CREATE_RGB(int nSP, int nWidth, int nHeight,rgb_t tm,int nBlendRate = 255, int bShow = true)
{
  SP_CREATE(nSP,nWidth,nHeight, tm.r, tm.g , tm.b ,nBlendRate,bShow);
}

 次に構造体作成用の関数を作ります。

 rgb_t RGB(string szA)
{
 rgb_t tm;	tm.r = 000; tm.g = 000; tm.b = 000;
		switch(szA)
	{case "黒":	tm.r = 000; tm.g = 000; tm.b = 000; break;//せっかくだから
	 case "青":	tm.r = 000; tm.g = 000; tm.b = 255; break;//この三色セット
	 case "赤":	tm.r = 255; tm.g = 000; tm.b = 000; break;//一文字で色表示できます
	}
	if( 	szA.Length()     ==  7 &&
		szA.GetPart(0,1) == "#")
		{
			tm.r = Nibble(szA.GetPart(1,2));
			tm.g = Nibble(szA.GetPart(3,2));
			tm.b = Nibble(szA.GetPart(5,2));
		}
	return tm;
}

 作ったら動かしてみましょう。

void game_main(void)
{
 SP_CREATE_RGB(1, 200, 300,RGB("赤"))A;
 SP_CREATE_RGB(1, 200, 300,RGB("青"))A;
 SP_CREATE_RGB(1, 200, 300,RGB("#FF00FF"))A;

コメント

 これでhtmlと同じ書式で色を指定できるわけですが、SACT2の色指定系関数をいちいちrgb_t用として新規に追加していくのはあまり効率的ではないように思います。
 できればsystem4.0の3つの引数での指定に慣れた方がいいでしょう。