val(s1)関数の16進数版No.00640
つよきち さん 99/07/13 15:55
 
val(s1)関数について、ヘルプにはこう書いてあります。

「s1を数値に変換します。例えばs1が"100"の場合,返す値は100となります」

これは、"100"が10進数であることが前提のようです。(16進数をパラメータとする
と0が返ります。)が、16進数の文字列(例"0x64")に対して、16進数の数値(0x64)を
返す、もしくは10進数の数値(100)を返す方法はないでしょうか?
なければ、そういう処理を作るしかないですが・・・

[ ]
RE:00640 val(s1)関数の16進数版No.00645
安久津 さん 99/07/14 07:02
 
はじめましてつよきちさん、安久津といいます。

>と0が返ります。)が、16進数の文字列(例"0x64")に対して、16進数の数値(0x64)を
>返す、もしくは10進数の数値(100)を返す方法はないでしょうか?
これはどうでしょう?

 $$hex = "0x64";
 call valHex $$hex;
 ##num = ##return;
 menu "$$hex = " + $$hex, "##num = " + str(##num), "&N 了解";
endmacro;
/////////
// val とは異なり、16進表記の文字列を数値に変換する。
valHex:
 $$hex = $$1;
 if( leftstr( $$hex, 2 ) == "0x" ) $$hex = midstr($$hex, 2, strlen($$hex)-2 );
 ##highBit = 0;
 ##iend = strlen( $$hex );
 if( ##iend > 7 ){
 $$hex = rightstr( $$hex, 8 );
 $$tmp = leftstr( $$hex, 1 );
 $$hex = midstr( $$hex, 1, 7 );
 ##iend = 7;
 ##highBit = 1;
 }
 ##A = 65; ##value = 0;
 ##i = 0;
 while( ##i < ##iend ){
 $$ch = midstr( $$hex, ##i, 1 );
 ##ch = ascii( $$ch );
 if( ##ch > 47 && ##ch < 58 ){ // 数字
   ##num = val( $$ch );
 }else{
  if( ##ch > 96 && ##ch < 123 ) ##ch = ##ch - 32;
  ##num = 10 + ##ch - ##A;
 }
 ##value = ##value * 16 + ##num;
 ##i = ##i + 1;
 }
 if( ##highBit ){
 ##code = ascii( $$tmp );
 if( ##code > 47 && ##code < 58 ){
   ##num = val( $$tmp );
 }else{
  if( ##code > 96 && ##code < 123 ) ##code = ##code - 32;
  ##num = 10 + ##code - ##A;
 }
 // 0 <= ##num <= 15
 ##minus = 0;
 if( ##num & 0x08 ) ##minus = 0x80000000;
 ##num = (##num & 0x07) * 0x10000000;
 ##value = ##minus | ##num | ##value;
}

return ##value;
// end of valHex
//////////

ではでは。
#メールだと投稿しやすいです。(^^)

[ ]
RE:00645 val(s1)関数の16進数版No.00646
つよきち さん 99/07/14 08:44
 
はじめまして安久津さん。

>はじめましてつよきちさん、安久津といいます。
>
>>と0が返ります。)が、16進数の文字列(例"0x64")に対して、16進数の数値(0x64)を
>>返す、もしくは10進数の数値(100)を返す方法はないでしょうか?
>これはどうでしょう?
>・・・・


おぉ・・・(いとも簡単に・・・)
ありがとうございます!m(__)m
おかげさまでやりたいことが実現できそうです。
ほんとは、まだやりたいことがあるのですが、
質問ばかりしてても進歩しないので安久津さんの処理を参考に自分でやってみます。

[ ]