对:关于MSCOMM控件,如何将一串16进制的还原成10进制?高手请请进,急急急!!!(2004chenlong)帖子中函数的致欠声明

时间:2022-04-19 20:40:33
没分了,这几天提的问题把分都给了。。现在募捐中。。所以抠门,必须的,呵呵。。。。就给10分

原贴地址:
http://community.csdn.net/Expert/topic/4825/4825682.xml?temp=.4218408

我提供的函数有问题(不是说不能取得正确结果)

其实HEX2DEC并没有我提供的代码那么麻烦,可能对一些初学者造成了误导,在此道歉。
更正该函数如下:

Public Function Hex2Dec(InputData As String) As Double
Hex2Dec = "&H" & InputData
End Function

测试时请使用如下代码:

Public Function Hex2Dec(InputData As String) As Double
Hex2Dec = "&H" & InputData
End Function

Private Sub Form_Paint()
Me.AutoRedraw = True
Me.Height = 6180
Me.Width = 9990
Dim i As Long
For i = 0 To 31
    Print i; Hex(i); Hex2Dec(CStr(Hex(i))), _
          i + 32; Hex(i + 32); Hex2Dec(CStr(Hex(i + 32))), _
          i + 64; Hex(i + 64); Hex2Dec(CStr(Hex(i + 64))), _
          i + 96; Hex(i + 96); Hex2Dec(CStr(Hex(i + 96))), _
          i + 128; Hex(i + 128); Hex2Dec(CStr(Hex(i + 128))), _
          i + 160; Hex(i + 160); Hex2Dec(CStr(Hex(i + 160))), _
          i + 192; Hex(i + 192); Hex2Dec(CStr(Hex(i + 192))), _
          i + 224; Hex(i + 224); Hex2Dec(CStr(Hex(i + 224)))
Next
End Sub


虽然分少点,,我想2004chenlong还是不会介意的吧:)回一下拿分

9 个解决方案

#1


还是有问题呢。。。郁闷啊,把函数返回值声明为LONG比较好。哎。。老伤心了

#2



Private Sub C1_Click()
Dim n As Integer, a As Double
n = Len(Text1.Text)
If O1(2).Value = True Then
      For i = 0 To n - 1
         a = a + Val(Mid(Text1.Text, i + 1, 1)) * (2 ^ (n - i - 1))

     Next i
     Text1.Text = a
ElseIf O1(8).Value = True Then
    For i = 0 To n - 1
         a = a + Val(Mid(Text1.Text, i + 1, 1)) * (8 ^ (n - i - 1))
     Next i
    Text1.Text = a
ElseIf O1(16).Value = True Then
   
     For i = 0 To n - 1
         b = Mid(Text1.Text, i + 1, 1)
  
         a = a + Val(BToH(b)) * (16 ^ (n - i - 1))
     Next i
    Text1.Text = a


End If
End Sub
Public Function BToH(ByVal b As String) As String
Select Case b
Case "1": H = 1
Case "2": H = 2
Case "3": H = 3
Case "4": H = 4
Case "5": H = 5
Case "6": H = 6
Case "7": H = 7
Case "8": H = 8
Case "9": H = 9
Case "A": H = 10
Case "B": H = 11
Case "C": H = 12
Case "D": H = 13
Case "E": H = 14
Case "F": H = 15
Case "0": H = 0
End Select

BToH = H
End Functio
这是我刚写出来的 能用不过就是多了点~~ 2进制 8进制都有

#3


没分不回答,我更抠门,呵呵

#4


如何将一串16进制的还原成10进制

比如把FFFF还原成65535

Private Sub Command1_Click()
Debug.Print Hex2Dec("FFFF")
End Sub
Public Function Hex2Dec(InputData As String) As Double
Dim tmp As Double
inlen = Len(InputData)
If inlen Mod 2 = 1 Then InputData = "0" & InputData: inlen = inlen + 1
t = 1
For i = inlen \ 2 To 1 Step -1
tmp = tmp + t * CInt("&H" & Mid(InputData, i * 2 - 1, 2))
t = t * 256
Next
Hex2Dec = tmp
End Function

#5


TO:二位楼上:
    我不是问问题,只是对以前的回答道歉,这些进制转换函数我都有现成的代码,写也不麻烦,多是根据数制的原有换算方式转换的,但是16进制到10进制可以由VB来完成,看看我给的代码就知道了,一行就可以把16进制转为10进制


boiciy(喜欢去哪去哪) 你写的代码是不是有问题啊,你用我给的函数试试,


Public Function Hex2Dec(InputData As String) As Double
Hex2Dec = "&H" & InputData
End Function

Private Sub Form_Paint()
print Hex2Dec("FFFF")
End Sub

看看返回结果是什么?65535,一点都不差。虽然我在演示代码里面只用了0-255,但是实际上,VB在数据不溢出的情况下可以直接把任意一个16进制转换为10进制,实现方法就是在16进制字符串前加&H,然后将这个字符赋值给一个数值变量,一般来说长整就够了,但是也有更长的,那就可以用双精度或变体等类型。

我只所以用0-255进行演示而没有提上面这个问题,主要是因为原贴是将2位的16进制还原。。


看来我发这个帖子还真是有必要,呵呵,虽然原贴作者还没来,但可能已经让2位楼上有所感悟了

#6


觉得先不结贴比较好,原贴作者还没回,另外就是这个问题,还是值得新手思考的,其实还有一些进制转换可以不采用进制原换算方法来进行,并且能够减少代码数量或提高运行效率,就当抛砖引玉了,大家写出来发到这里看看


各位高手路过顶一下啊,呵呵,做点公益。。。

#7


谢谢 又让 我考虑到个问题~~

#8


带小数点的 怎么写简单点啊~~
我想了下  好象不少~》???楼主

#9


能带小数点啊,哎呀?

分开,都按整算,然后恢复小数点后面

#1


还是有问题呢。。。郁闷啊,把函数返回值声明为LONG比较好。哎。。老伤心了

#2



Private Sub C1_Click()
Dim n As Integer, a As Double
n = Len(Text1.Text)
If O1(2).Value = True Then
      For i = 0 To n - 1
         a = a + Val(Mid(Text1.Text, i + 1, 1)) * (2 ^ (n - i - 1))

     Next i
     Text1.Text = a
ElseIf O1(8).Value = True Then
    For i = 0 To n - 1
         a = a + Val(Mid(Text1.Text, i + 1, 1)) * (8 ^ (n - i - 1))
     Next i
    Text1.Text = a
ElseIf O1(16).Value = True Then
   
     For i = 0 To n - 1
         b = Mid(Text1.Text, i + 1, 1)
  
         a = a + Val(BToH(b)) * (16 ^ (n - i - 1))
     Next i
    Text1.Text = a


End If
End Sub
Public Function BToH(ByVal b As String) As String
Select Case b
Case "1": H = 1
Case "2": H = 2
Case "3": H = 3
Case "4": H = 4
Case "5": H = 5
Case "6": H = 6
Case "7": H = 7
Case "8": H = 8
Case "9": H = 9
Case "A": H = 10
Case "B": H = 11
Case "C": H = 12
Case "D": H = 13
Case "E": H = 14
Case "F": H = 15
Case "0": H = 0
End Select

BToH = H
End Functio
这是我刚写出来的 能用不过就是多了点~~ 2进制 8进制都有

#3


没分不回答,我更抠门,呵呵

#4


如何将一串16进制的还原成10进制

比如把FFFF还原成65535

Private Sub Command1_Click()
Debug.Print Hex2Dec("FFFF")
End Sub
Public Function Hex2Dec(InputData As String) As Double
Dim tmp As Double
inlen = Len(InputData)
If inlen Mod 2 = 1 Then InputData = "0" & InputData: inlen = inlen + 1
t = 1
For i = inlen \ 2 To 1 Step -1
tmp = tmp + t * CInt("&H" & Mid(InputData, i * 2 - 1, 2))
t = t * 256
Next
Hex2Dec = tmp
End Function

#5


TO:二位楼上:
    我不是问问题,只是对以前的回答道歉,这些进制转换函数我都有现成的代码,写也不麻烦,多是根据数制的原有换算方式转换的,但是16进制到10进制可以由VB来完成,看看我给的代码就知道了,一行就可以把16进制转为10进制


boiciy(喜欢去哪去哪) 你写的代码是不是有问题啊,你用我给的函数试试,


Public Function Hex2Dec(InputData As String) As Double
Hex2Dec = "&H" & InputData
End Function

Private Sub Form_Paint()
print Hex2Dec("FFFF")
End Sub

看看返回结果是什么?65535,一点都不差。虽然我在演示代码里面只用了0-255,但是实际上,VB在数据不溢出的情况下可以直接把任意一个16进制转换为10进制,实现方法就是在16进制字符串前加&H,然后将这个字符赋值给一个数值变量,一般来说长整就够了,但是也有更长的,那就可以用双精度或变体等类型。

我只所以用0-255进行演示而没有提上面这个问题,主要是因为原贴是将2位的16进制还原。。


看来我发这个帖子还真是有必要,呵呵,虽然原贴作者还没来,但可能已经让2位楼上有所感悟了

#6


觉得先不结贴比较好,原贴作者还没回,另外就是这个问题,还是值得新手思考的,其实还有一些进制转换可以不采用进制原换算方法来进行,并且能够减少代码数量或提高运行效率,就当抛砖引玉了,大家写出来发到这里看看


各位高手路过顶一下啊,呵呵,做点公益。。。

#7


谢谢 又让 我考虑到个问题~~

#8


带小数点的 怎么写简单点啊~~
我想了下  好象不少~》???楼主

#9


能带小数点啊,哎呀?

分开,都按整算,然后恢复小数点后面