pb进制转化的通用函数

$PBExportHeader$gf_convertnumsys.srf
global type gf_convertnumsys from function_object
end type

forward prototypes
global function string gf_convertnumsys (long ai_value, long ai_how)
end prototypes

global function string gf_convertnumsys (long ai_value, long ai_how);//进制转化的通用函数
//==================================================================== 
//   [FUNCTION]    :   gf_convertnumsys() 
//   [RETURNS]     :   string   
//   [ARGEMENTS]   :   
//     value   integer   ai_value       需要转化的10进制数   
//     value   integer   ai_how         转化方式(共3种:   2,8,16) 
//-------------------------------------------------------------------- 
//   [DESCRIPTION]:   把10进制转化成2,8,16进制(10进制数必须大于零) 
//==================================================================== 

String   two,sixteen,eight //定义三个字符串变量,用来存放最后输出的进制值 
String   ls_return
Long     lentwo,duan,i,j
String   aa[50],a[50],b[4]

//==================================================================== 
//   先把10进制数据通过取余数转换成2进制 
//   10进制到2进制的转换是通过取余数实现 
//==================================================================== 
DO WHILE ai_value > 0
	two = two + String(Mod(ai_value,2))
	ai_value = ai_value / 2
LOOP
//==================================================================== 
//   选择输出进制 
//==================================================================== 
CHOOSE CASE ai_how
	CASE 2
		//由于上面得到的2进制的数据方向是相反的:11011101101,所以要通过reverse()函数重新 //把它颠倒过来 
		two = Reverse(two) //得到正确的2进制10110111011 
		ls_return = two
	CASE 8
		//2进制到8进制的转换是这样的,从右往左每3位为一个段,即8进制的一位, 
		lentwo = Len(two) //取2进制的长度 
		IF Mod(lentwo,3) > 0   THEN //分段 
			duan=lentwo/3 + 1
		ELSE
			duan=lentwo/3
		END IF
		FOR i = duan To 1 Step -1 //由于没有颠倒过来的2进制是从右往左的,所以 //分出来的段从左往右就是由大到小 
			aa[duan] = Mid(two,i * 3 - 2,3) //取出每一段的2进制值 
			a[duan] = '0 '
			FOR j = 1 To 3
				b[j] = Mid(aa[duan],j,1) //每一段从右往左取值 
				IF b[j] <> ' ' THEN
					a[duan] = String(Integer(a[duan]) + 2^(j -1   ) * Integer(b[j]))
					//按照2^0   *   x   +   2^1   *x   +2^2   *   x 
					//x为分别为从右到左的2进制的值,累加得到每一段的8进制值 
				END IF
			NEXT
			eight = eight + a[duan] //8进制段累加得到最后的8进制值 
		NEXT
		ls_return = eight
	CASE   16
		//16进制的方法如同8进制,只是每4位为一段而已 
		lentwo = Len(two)
		IF Mod(lentwo,4) > 0 THEN
			duan = lentwo / 4 + 1
		ELSE
			duan = lentwo /4
		END IF
		FOR i = duan To 1 Step -1
			aa[duan] = Mid(two,i * 4 - 3,4)
			a[duan] = '0 '
			FOR j = 1 To 4
				b[j] = Mid(aa[duan],j,1)
				IF b[j] <> ' ' THEN
					a[duan] = String(Integer(a[duan]) + 2^(j -1) * Integer(b[j]))
				END IF
					CHOOSE CASE Integer(a[duan])
						CASE 10
							a[duan] = 'A'
						CASE 11
							a[duan] = 'B'
						CASE 12
							a[duan] = 'C'
						CASE 13
							a[duan] = 'D'
						CASE 14
							a[duan] = 'E'
						CASE 15
							a[duan] = 'F'
					END CHOOSE
			NEXT
			sixteen = sixteen + a[duan]
		NEXT
		ls_return = sixteen
	CASE ELSE
END CHOOSE
				
RETURN ls_return
				
				
				

end function

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值