HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0428
ヂオン10桁以上の 10 進数を 16 進数に変換4解決


ヂオン

リンク

2012/4/28(Sat) 10:53:00|NO.46290

10桁以上の 10 進数を 16 進数に変換するにはどうしたらよいのでしょうか。

例えば

tx="120339209102910293839182"

を変換するとして、どうしても
商を16で割り続ける方法だと、32bit 超えてしまうため、計算ができません。
出来れば変換する桁の限界を無くしたいと思っています。

一応作成中のモジュールも載せておきます。


#module // 文字列を 指定したサイズのバッファに変換します。 // StrToBuf rt,"$00112233",2 を変換した場合 // rt の中身は // 33 22 // の 2byte に成る #deffunc StrToBuf var buf_ , str tx_ , int size_,local i_ , local count_ , local v_ _tmp=tx_ // 先頭のキャラクター c = peek(_tmp) is_16 = (c=='$') // 16 進数 eof ~ top is_2 = (c=='%') // 2 進数 eof ~ top is_b = (c=='#') // 16 進数 バイナリ top ~ eof if(is_16 or is_2 or is_b){ _tmp=strmid(_tmp,1,0x7FFFFFFF) } _len=strlen(_tmp) memexpand buf_,size_ memset buf_,0,size_ if(is_16){_proc = *for16:gosub *create // 16 進数 }else:if(is_2){_proc = *for2:gosub *create // 2 進数 }else:if(is_b){_proc = *forbin:gosub *create// binary }else{ // 取りあえず32bit制限に妥協中 _tmp = strf("%x",limit(int(_tmp),0x80000000,0x7fffffff)) _len = strlen(_tmp) _proc = *for16:gosub *create } return *create repeat _len gosub _proc if(stat):poke buf_,count_,v_:v_=0:count_++ if(count_==size_):break loop if(v_!=0 and count_<size_):poke buf_,count_,v_ return *for16 v_ |= int("$"+strmid(_tmp,(_len-1)-cnt,1))<<((cnt\2)*4) return (cnt\2)==1 *for2 v_ |= (peek(_tmp,(_len-1)-cnt)=='1')<<(cnt\8) return (cnt\8)==7 *forbin v_ |= int("$"+strmid(_tmp,cnt,1))<<((cnt\2)*4) return (cnt\2)==1 #global tx="120339209102910293839182" sdim rt StrToBuf rt,tx,2 dupptr rti,varptr(rt),2 mes strf("%d",rti)



この記事に返信する


玄冬

リンク

2012/4/28(Sat) 13:06:18|NO.46291

 
#module
#define m_dividend 16 #defcfunc cf_hex str p_STR sdim a_chara, 1, m_dividend a_chara(0) = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" v_divisor = p_STR v_hex = "" repeat -1 if 2 < strlen(v_divisor) | m_dividend <= int(v_divisor){ gosub *sub_divide v_divisor = v_quotient v_hex = a_chara(v_remainder) + v_hex }else { v_hex = a_chara(int(v_divisor)) + v_hex break } wait 0 loop return v_hex *sub_divide v_quotient = "" v_remainder = 0 repeat strlen(v_divisor) v_temp = 10 * v_remainder + int(strmid(v_divisor, cnt, 1)) if m_dividend <= v_temp { v_quotient += str(v_temp / m_dividend) v_remainder = v_temp \ m_dividend }else { if int(v_quotient) ! 0 : v_quotient += "0" v_remainder = v_temp } loop return #global mes cf_hex("120339209102910293839182")



ヂオン

リンク

2012/4/28(Sat) 13:47:09|NO.46292

有難うございます。
助かりました。



ヂオン

リンク

2012/4/28(Sat) 13:48:07|NO.46293

解決押し忘れました。



y.ack

リンク

2012/4/28(Sat) 19:52:59|NO.46300

公式サイト→MAKE→拡張プラグイン・ツールの紹介→システム総合、多目的DLL→HSP3用多倍長整数演算プラグイン・RSAモジュール

のdllでbignum使えますよ。32bitを越える計算の一つでした



ONION software Copyright 1997-2023(c) All rights reserved.