回 帖 发 新 帖 刷新版面

主题:急求  把十六进制数转换成十进制数的代码

急求  把十六进制数转换成十进制数的代码[em10][em10][em10]

回复列表 (共7个回复)

沙发

进制转换是算法编程中常用的技术,特别是设计串口和通讯方面。PB没有提供直接的进制转换函数,如果程序中需要进行进制转换,可以自己编写处理函数调用。
本文提供一种实现方法,原理非常简单,并已封装成用户对象。
实现过程如下
1、建立一个工作空间(workspace),取名为:numberconvert。
2、建立一个应用(application),取名为:numberconvert。
3、建立一个标准的不可视用户对象,取名为:nvo_number_convert。

4、定义用户对象级函数uf_Other2Binary()。该函数可将其他进制数转换为二进制数,函数定义如下:

板凳

//-----------------------------------------------------------------//
// 函数名称: uf_Other2Binary
// 功能描述: 其它进制数转换为二进制数
// 作用范围: Public
// 参数说明: as_num:要转换的数值
//              ai_type:原进制类型
// 返 回 值: 转换后的二进制数值
// 使用举例: uf_Other2Binary('255',  10) 
//              为将十进制数255转换为2进制数
//-----------------------------------------------------------------//
integer li_i
long ll_num
string ls_rtn
//根据目标进制的不同做不同处理
Choose Case ai_type
    Case 2 //二进制
        ls_rtn = as_num
    Case 8 //八进制
        For li_i= 1 To len(as_num)
            choose Case mid(as_num, li_i, 1) 
                Case "0"
                    ls_rtn = ls_rtn + "000"
                Case "1"
                    ls_rtn = ls_rtn + "001"
                Case "2"
                    ls_rtn = ls_rtn + "010"
                Case "3"
                    ls_rtn = ls_rtn + "011"
                Case "4"
                    ls_rtn = ls_rtn + "100"
                Case "5"
                    ls_rtn = ls_rtn + "101"
                Case "6"
                    ls_rtn = ls_rtn + "110"
                Case "7"
                    ls_rtn = ls_rtn + "111"
            End choose
        next 
    Case 10 //十进制
        li_i = long(as_num)
        Do while li_i >= 1
            ls_rtn = string(mod(li_i, 2)) +  ls_rtn
            li_i = (li_i - mod(li_i, 2)) / 2
        Loop    
    Case 16 //十六进制
        For li_i= 1 to len(as_num)
            choose Case mid(as_num, li_i, 1) 
                Case "0"
                    ls_rtn = ls_rtn + "0000"
                Case "1"
                    ls_rtn = ls_rtn + "0001"
                Case "2"
                    ls_rtn = ls_rtn + "0010"
                Case "3"
                    ls_rtn = ls_rtn + "0011"
                Case "4"
                    ls_rtn = ls_rtn + "0100"
                Case "5"
                    ls_rtn = ls_rtn + "0101"
                Case "6"
                    ls_rtn = ls_rtn + "0110"
                Case "7"
                    ls_rtn = ls_rtn + "0111"
                Case "8"
                    ls_rtn = ls_rtn + "1000"
                Case "9"
                    ls_rtn = ls_rtn + "1001"
                Case "a", "A"
                    ls_rtn = ls_rtn + "1010"
                Case "b", "B"
                    ls_rtn = ls_rtn + "1011"
                Case "c", "C"
                    ls_rtn = ls_rtn + "1100"
                Case "d", "D"
                    ls_rtn = ls_rtn + "1101"
                Case "e", "E"
                    ls_rtn = ls_rtn + "1110"
                Case "f", "F"
                    ls_rtn = ls_rtn + "1111"
            End Choose
        Next 
    Case Else
        ls_rtn = as_num
        MessageBox('提示信息', '不正确的进制参数!')        
End Choose
Return ls_rtn

3 楼

5、定义用户对象级函数uf_Binary2Other()。该函数可将二进制数转换为其他进制数,函数定义如下:
//-----------------------------------------------------------------//
// 函数名称: uf_Binary2Other
// 功能描述: 二进制数转换为其它进制数
// 作用范围: Public
// 参数说明: as_num:二进制数值
//              ai_type:目标进制类型
// 返 回 值: 目标进制数值
// 使用举例: uf_binary2other('1011',  10) 
//              为将二进制数1011转换为10进制数
//-----------------------------------------------------------------//
integer li_i
long ll_num
string ls_rtn
//根据目标进制的不同做不同处理
Choose Case ai_type
        
    Case 2 //二进制
        ls_rtn = as_num
    Case 8 //八进制
        //补0
        Do while mod(len(as_num), 3) <> 0 
            as_num = "0" + as_num
        Loop
        For li_i = 1  to len(as_num) Step 3
            ll_num = long(mid(as_num, li_i, 1)) * 4 + &
                    long(mid(as_num, li_i+1, 1)) * 2 + long(mid(as_num, li_i+2, 1))
            ls_rtn = ls_rtn + string(ll_num)
        Next            
    Case 10 //十进制
        For li_i=1 to len(as_num)
            IF mid(as_num, li_i, 1) = "0" then 
                ll_num = ll_num * 2 
            else
                ll_num = ll_num * 2 + 1
            end if
        next         
        ls_rtn = string(ll_num)        
    Case 16 //十六进制
        //补0
        do while mod(len(as_num), 4)<>0 
            as_num = "0" + as_num
        loop
        For li_i = 1  to len(as_num) step 4
            Choose Case mid(as_num, li_i, 4) 
                Case "0000" 
                    ls_rtn = ls_rtn + "0"
                Case "0001"
                    ls_rtn = ls_rtn + "1"
                Case "0010"
                    ls_rtn = ls_rtn + "2"
                Case "0011"
                    ls_rtn = ls_rtn + "3"
                Case "0100"
                    ls_rtn = ls_rtn + "4"
                Case "0101"
                    ls_rtn = ls_rtn + "5"
                Case "0110"
                    ls_rtn = ls_rtn + "6"
                Case "0111"
                    ls_rtn = ls_rtn + "7"
                Case "1000"
                    ls_rtn = ls_rtn + "8"
                Case "1001"
                    ls_rtn = ls_rtn + "9"
                Case "1010"
                    ls_rtn = ls_rtn + "A"
                Case "1011"
                    ls_rtn = ls_rtn + "B"
                Case "1100"
                    ls_rtn = ls_rtn + "C"
                Case "1101"
                    ls_rtn = ls_rtn + "D"
                Case "1110"
                    ls_rtn = ls_rtn + "E"
                Case "1111"
                    ls_rtn = ls_rtn + "F"
            End Choose
        Next            
    Case Else
        ls_rtn = as_num
        MessageBox('提示信息', '不正确的进制参数!')        
End Choose
Return ls_rtn

4 楼

6、定义用户对象级函数uf_Number_Convert()。该函数可完成任意进制数之间转换,函数定义如下:
//-----------------------------------------------------------------//
// 函数名称: uf_Number_Convert
// 功能描述: 进制转换
// 作用范围: Public
// 参数说明: as_num:要转换的数值
//              ai_type1:源进制类型
//              ai_type2:目标进制类型
// 返 回 值: 转换后数值
// 使用举例: uf_Number_Convert('1010', 2, 10) 
//              为将2进制数1010转换为10进制数
//-----------------------------------------------------------------//
String ls_rtn
String ls_temp
//根据目标进制处理
Choose Case ai_type2
    Case 2 //目标进制为2进制
        //其它进制转换为2进制
        ls_rtn = uf_Other2Binary(as_num, ai_type1) 
    Case 8 //目标进制为8进制
        CHoose Case ai_type1 //根据源进制处理
            Case 2 //2进制--> 8进制
                ls_rtn = uf_Binary2Other(as_num, 8) //2->8
            Case 8 //8进制--> 8进制
                ls_rtn =    as_num                
            Case 10,16 //10或16进制--> 8进制
                ls_temp = uf_Other2Binary(as_num, ai_type1) //10或16->2 
                ls_rtn = uf_Binary2Other(ls_temp, 8) //2->8
        End CHoose        
    Case 10
        CHoose Case ai_type1 //根据源进制处理
            Case 2 //2进制--> 10进制
                ls_rtn = uf_Binary2Other(as_num, 10) //2->10
            Case 8,16 //8或16进制--> 10进制
                ls_temp = uf_Other2Binary(as_num, ai_type1) //8或16->2 
                ls_rtn = uf_Binary2Other(ls_temp, 10) //2->10
            Case 10 //10进制--> 10进制
                ls_rtn =    as_num                
        End CHoose        
    Case 16 //目标进制为16进制
        CHoose Case ai_type1 //根据源进制处理
            Case 2 //2进制--> 16进制
                ls_rtn = uf_Binary2Other(as_num, 16) //2->16
            Case 8,10 //8或10进制--> 16进制
                ls_temp = uf_Other2Binary(as_num, ai_type1) //8或10->2 
                ls_rtn = uf_Binary2Other(ls_temp, 16) //2->16
            Case 16 //16进制--> 16进制
                ls_rtn =    as_num            
        End CHoose        
End Choose
Return ls_rtn
//---------------------------------------------------------------
//函数也可以写成:
/*
String ls_rtn
String ls_temp
//源进制数值转换为二进制中间数
ls_temp = uf_Other2Binary(as_num, ai_type1) 
//二进制中间数转换目标进制
ls_rtn = uf_Binary2Other(ls_temp, ai_type2) 
Return ls_rtn
*/

7、调用,建立一个Main类型窗口w_main,按下图进行设计。

5 楼

1)、Open事件
invo_number_convert = Create nvo_number_convert
2)、Close事件
Destroy invo_number_convert
3)、输入一个十进制数15,点击其他进制按钮,得出其他进制的数。

6 楼

可惜我不知道如何贴图片.

7 楼


非常感谢,辛苦您了

我来回复

您尚未登录,请登录后再回复。点此登录或注册