任意进制互转,自己写的有毛病,老师进来看下哪里出错了

「已注销」 2017-06-03 09:38:26

上次发帖问了之后有点事没来论坛看,今天上来看了下还是对你们写的有点晕,自己也认真写过,但是就是字母大了就出错!
下面代码是按键精灵安卓电脑助手写的,应该都通用,初中没毕业,只能用笨法字符串操作。。
Function 任意进制转换(初始进制,被转换数据)
Dim 位值,整数,余数,权值,真值,整数临值,余数临值,母单=array("a","b","c","d","e","f","g","h","j","k","l","m","n","p","q","r","t","u","v","w","x","y")
Dim 母单数=array(10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31)
For ji = 0 To UBOUND(母单)
If InStr(1, 被转换数据, LCase(母单(ji))) > 0 Then
被转换数据 = Replace(被转换数据, 母单(ji), UCase(母单(ji)))
End If
Next //这里是对每个数据截取单位数据看是否有大写字母,有的话就转成小写字母
If InStr(1, 被转换数据, ".") > 1 Then
整数 = Mid(被转换数据, 1, InStr(1, 被转换数据, ".")-1)
余数 = Mid(被转换数据, InStr(1, 被转换数据, ".") + 1, Len(被转换数据) - InStr(1, 被转换数据, ".") + 1)
Else
整数 = 被转换数据
余数 = 0
End If //这里是检测是否小数,是小数就 挑出整数 跟小数
For a = 1 To Len(整数)
位值 = Mid(整数, a, 1)
For ji = 0 To Len(整数)
If LCase(位值) = 母单(ji) Then
位值 = 母单数(ji)
End If
Next // 这里是检测整数每一位是否有字母,有的话转成相对应的数值。
位值 = CInt(位值)
If 位值 > 初始进制-1 Then
TracePrint"错误!非"&初始进制&"进制"
Exit Function
End If //检查是否有大于进制的字母数字。
权值 = Len(整数) - a
真值 = 位值 * (初始进制 ^ 权值)
整数临值 = 整数临值 + 真值
Next
// 整数转换是按权展开的。 下面余数部分同理。
真值 = 0
If 余数 <> 0 Then
For b = 1 To Len(余数)
位值 = CInt(Mid(余数, b, 1))
If 位值 > 初始进制-1 Then
TracePrint"错误!非"&初始进制&"进制"
Exit Function
End If
权值 = -b
真值 = 位值 * (初始进制 ^ 权值)
余数临值 = 余数临值 + 真值
Next
End If
任意进制转换 = 整数临值 + 余数临值
End Function

//列如32进制数转换成十进制: TracePrint Utcpu.任意进制互转(128,"1253A.1")
但是测试结果请看:



错误结果:


怎么会这样呢,还有,任意进制转十进制的时候字母少了3个,但是我百度了人家就说少那3个,但是邪门的是十进制转任意进制的时候26字母又全用上了,下面是十进制转任意进制的,不支持小数,字母大了还是出错!
Function 十进制转任意进制(真十进值,待转换进制)
Dim Shzz,待余数,Intxt
Dim 母单=array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
Do
Shzz = 真十进值 / 待转换进制
If Shzz > 0 Then
待余数 = 真十进值 Mod 待转换进制
真十进值 = Fix(Shzz)
If 待余数 >= 10 Then
待余数=母单(待余数-10)
End If
Intxt = Intxt & 待余数
Else
Exit Do
End If
Loop
十进制转任意进制 = UTF8.StrReverse(Intxt)
End Function

代码用按键精灵安卓写的,字符处理函数应该通用。
...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2017-06-04
  • 打赏
  • 举报
回复
你的“任意进制转10进制”(最开始的那个函数),“码表”明显不对吧! 不是少3个字母,是少4个: i、o、s、z 而“10转任意”时是全部用上的,这显然就会“对不上号”,这样“互转结果”必然不能相符。
「已注销」 2017-06-04
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
你的“任意进制转10进制”(最开始的那个函数),“码表”明显不对吧! 不是少3个字母,是少4个: i、o、s、z 而“10转任意”时是全部用上的,这显然就会“对不上号”,这样“互转结果”必然不能相符。
还真少了。。。但是我有次查百度的时候它那码表少了ios这三个,我就复制它那个
笨狗先飞 2017-06-03
  • 打赏
  • 举报
回复
贴进来蹭点分吧

'从十进制转成任意进制,Num 要转换的数字,NumS数制值,16进制,你可以填16,返回值是个数组
Private Function FromDec(ByVal Num As Long, ByVal NumS As Integer) As Integer()
    Dim C As Integer, Result() As Integer
    Do Until Num = 0
        ReDim Preserve Result(C)
        Result(C) = Num Mod NumS
        C = C + 1
        Num = Num \ NumS
    Loop
    FromDec = Result
End Function

'从任意进制转成十进制 Num()任意进制数,是个数组,你可以从前一个函数里得到,NumS还是进制数,返回值是个十进制数
Private Function ToDec(ByRef Num() As Integer, ByVal NumS As Integer) As Long
    Dim I As Integer, Result As Long
    For I = 0 To UBound(Num)
        Result = Result * NumS + Num(I)
    Next
    ToDec = Result
End Function

'生成一个进制串,Num就是转成任意进制后的数,是个数组,NumStr这个进制数的符号序列,比如十六进制的序列就是0123456789ABCDEF,不填的话出来(1)(2)这种样子的数
Private Function ShowValue(ByRef Num() As Integer, Optional ByVal NumStr As String = "") As String
    Dim I As Integer, Result As String
    For I = 0 To UBound(Num)
        If Len(NumStr) > 0 Then
            Result = Mid(NumStr, Num(I) + 1, 1) & Result
        Else
            Result = "(" & Num(I) & ")" & Result
        End If
    Next
    ShowValue = Result
End Function

Private Sub Form_Load()
    Dim Arr() As Integer
    Arr = FromDec(64, 16) '把64转成16进制结果保存在Arr数组中
    Debug.Print ShowValue(Arr, "0123456789ABCDEF") '显示Arr数组中的16进制数
End Sub

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧