Public Function Bin2Oct(BinNum As String) As String
'二进制数转八进制数
Dim m_lngCounter As Long '计数器
Dim m_strInteger As String '整数部分
Dim m_strFloat As String '小数部分
Dim m_strIntegerA As String '转换后的整数部分
Dim m_strFloatA As String '转换后的小数部分
If IsLegal(BinNum, 2) = False Then Exit Function '不合法数据
Public Function Hex2Bin(HexNum As String) As String
'十六进制数转二进制数
Dim m_lngCounter As Long '计数器
Dim m_strInteger As String '整数部分
Dim m_strFloat As String '小数部分
Dim m_strIntegerA As String '转换后的整数部分
Dim m_strConv As String '中间转换字串
Dim m_strFloatA As String '转换后的小数部分
If IsLegal(HexNum, 16) = False Then Exit Function '不合法数据
Public Function Oct2Bin(OctNum As String) As String
'八进制数转二进制数
Dim m_lngCounter As Long '计数器
Dim m_strInteger As String '整数部分
Dim m_strFloat As String '小数部分
Dim m_strIntegerA As String '转换后的整数部分
Dim m_strConv As String '中间转换字串
Dim m_strFloatA As String '转换后的小数部分
If IsLegal(OctNum, 8) = False Then Exit Function '不合法数据
Public Function Hex2Dec(HexNum As String) As Double
'十六进制数转十进制数
If IsLegal(HexNum, 16) = False Then Exit Function '不合法数据
Hex2Dec = Bin2Dec(Hex2Bin(HexNum))
End Function
Public Function Oct2Dec(OctNum As String) As Double
'八进制数转十进制数
If IsLegal(OctNum, 8) = False Then Exit Function '不合法数据
Oct2Dec = Bin2Dec(Oct2Bin(OctNum))
End Function
Private Function IsLegal(Number As String, Base As Integer) As Boolean
'判断数据是否合法
Dim m_lngCounter As Long '计数器
Dim m_lngCounterA As Long '计数器
Dim m_strChar As String '字符
'判断长度
If Number = vbNullString Then
IsLegal = False
Exit Function
End If
'判断小数点是否合法
m_lngCounter = InStr(1, Number, c_strPoint)
If m_lngCounter <> 0 Then
If InStr(m_lngCounter + 1, Number, c_strPoint) <> 0 Or _
Left(Number, 1) = c_strPoint Or _
Right(Number, 1) = c_strPoint Then
IsLegal = False
Exit Function
End If
End If
'判断数字是否合法
For m_lngCounter = 1 To Len(Number)
For m_lngCounterA = 1 To Base
m_strChar = UCase(Mid(Number, m_lngCounter, 1))
If GetCharNum(m_strChar) > Base - 1 Then
IsLegal = False
Exit Function
End If
Next m_lngCounterA
Next m_lngCounter
IsLegal = True
End Function
Private Function GetNumChar(Number As Integer) As String
'数字对应位
If Number < 10 Then
GetNumChar = CStr(Number)
Else
GetNumChar = Chr(vbKeyA + Number - 10)
End If
End Function
Private Function GetCharNum(Char As String) As Integer
'位对应数字
If Asc(Char) >= vbKey0 And Asc(Char) <= vbKey9 Then
GetCharNum = CInt(Char)
Else
GetCharNum = Asc(Char) - vbKeyA + 10
End If
End Function
Private Sub SeparatePoint(Number As String, IntegerPart As String, FloatPart As String)
'分离整数与小数部分
Dim m_lngCounter As Long '计数器
m_lngCounter = InStr(1, Number, c_strPoint)
If m_lngCounter <> 0 Then
IntegerPart = Mid(Number, 1, m_lngCounter - 1)
FloatPart = Mid(Number, m_lngCounter + 1)
Else
IntegerPart = Number
FloatPart = vbNullString
End If
End Sub
Private Function BinByte2HexByte(BinByte As String) As String
'二进制字节转十六进制字节
Dim m_intCounter As Integer '计数器
Dim m_intNum As Integer '数值
For m_intCounter = 1 To 4
m_intNum = m_intNum + CInt(Mid(BinByte, m_intCounter, 1)) * 2 ^ (4 - m_intCounter)
Next m_intCounter
BinByte2HexByte = Hex(m_intNum)
End Function
Private Function BinByte2OctByte(BinByte As String) As String
'二进制字节转八进制字节
Dim m_intCounter As Integer '计数器
Dim m_intNum As Integer '数值
For m_intCounter = 1 To 3
m_intNum = m_intNum + CInt(Mid(BinByte, m_intCounter, 1)) * 2 ^ (3 - m_intCounter)
Next m_intCounter
BinByte2OctByte = CStr(m_intNum)
End Function
Private Function Byte2BinByte(ByteChar As String) As String
Private Function FillZero(Number As String, FillNum As Integer, FillAfter As Boolean) As String
'填充“0”
If FillAfter = False Then
FillZero = String(((Len(Number) + FillNum - 1) \ FillNum) * FillNum - Len(Number), "0") & Number
Else
FillZero = Number & String(((Len(Number) + FillNum - 1) \ FillNum) * FillNum - Len(Number), "0")
End If
End Function
Private Function RTrimZero(Target As String) As String
'去掉最右边的“0”
Dim m_lngCounter As Long '计数器
If Target = vbNullString Then Exit Function
For m_lngCounter = Len(Target) To 1 Step -1
If Mid(Target, m_lngCounter, 1) <> "0" Then
RTrimZero = Mid(Target, 1, m_lngCounter)
Exit Function
End If
Next m_lngCounter
Private Const c_strPoint As String = "."
Private Const c_intBaseNMax As Integer = 16 '最大进制
Public Function Dec2BaseN(DecNum As Currency, BaseN As Integer, NAfter As Integer) As String
'十进制数转任意进制
Dim m_curInteger As Currency '整数部分
Dim m_dblFloat As Double '小数部分
Dim m_strInteger As String '结果整数部分
Dim m_strFloat As String '结果小数部分
Dim m_intCounter As Integer '计数器
If BaseN > c_intBaseNMax Or BaseN < 2 Then Exit Function '进制不正确
Public Function Bin2Dec(BinNum As String) As Double
'二进制数转十进制数
Dim m_lngCounter As Long '计数器
Dim m_strInteger As String '整数部分
Dim m_strFloat As String '小数部分
Dim m_curInteger As Currency '整数数字
Dim m_sngFloat As Single '小数数字
If IsLegal(BinNum, 2) = False Then Exit Function '不合法数据
For m_lngCounter = 1 To Len(m_strInteger)
m_curInteger = m_curInteger + CLng(Mid(m_strInteger, m_lngCounter, 1)) * (2 ^ (Len(m_strInteger) - m_lngCounter))
Next m_lngCounter
For m_lngCounter = 1 To Len(m_strFloat)
m_sngFloat = m_sngFloat + CLng(Mid(m_strFloat, m_lngCounter, 1)) * (2 ^ (-m_lngCounter))
Next m_lngCounter
Bin2Dec = CDbl(m_curInteger) + CDbl(m_sngFloat)
End Function
Public Function Bin2Hex(BinNum As String) As String
'二进制数转十六进制数
Dim m_lngCounter As Long '计数器
Dim m_strInteger As String '整数部分
Dim m_strFloat As String '小数部分
Dim m_strIntegerA As String '转换后的整数部分
Dim m_strFloatA As String '转换后的小数部分
If IsLegal(BinNum, 2) = False Then Exit Function '不合法数据
'刚写的代码,理论上可以转换非常大的数字,大家试试:
Private Sub Form_Click()
Dim start As Long
Const hugenum = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
start = Timer
MsgBox dectohex(hugenum), , "it take me about " & Format((Timer - start), "0.0000") & " seconds to trans the hugenum to hex"
End Sub
Function half(ByVal x As String) As String 'get half of x
x = 0 & x
Dim i As Long
ReDim result(2 To Len(x)) As String
For i = 2 To Len(x)
result(i) = CStr(Val(Mid(x, i, 1)) \ 2 + IIf(Val(Mid(x, i - 1, 1)) Mod 2 = 1, 5, 0))
Next
half = Join(result, "")
If Left(half, 1) = "0" Then half = Right(half, Len(half) - 1) ' no zero ahead
End Function
Function dectohex(ByVal hugenum As String) As String ' trans hugenum to hex
Do While Len(hugenum) > 2
dectohex = Hex(Val(Right(hugenum, 4)) Mod 16) & dectohex
For i = 1 To 4 'devide hugenum by 16
hugenum = half(hugenum)
Next
Loop
dectohex = Hex(Val(hugenum)) & dectohex
End Function
'八进制,二进制同理
Function dectooct(ByVal hugenum As String) As String ' trans hugenum to oct
Do While Len(hugenum) > 1
dectooct = Oct(Val(Right(hugenum, 3)) Mod 8) & dectooct
For i = 1 To 3 'devide hugenum by 8
hugenum = half(hugenum)
Next
Loop
dectooct = Oct(Val(hugenum)) & dectooct
End Function
Function dectobin(ByVal hugenum As String) As String ' trans hugenum to bin
Do While Not hugenum = "1"
dectobin = Val(Right(hugenum, 1)) Mod 2 & dectobin
'少了个loop
Function dectobin(ByVal hugenum As String) As String ' trans hugenum to bin
Do While Not hugenum = "1"
dectobin = Val(Right(hugenum, 1)) Mod 2 & dectobin
我原来写的一个16进制的加法,你可以改造一下:你可以把大数化成N个2147483648(7FFFFFFF)相加即可,速度问题自己考虑,应该不是很慢。
Public Function HexAdd(sHexA As String, sHexB As String) As String
Dim i As Integer
Dim tmpA As String
Dim tmpB As String
Dim bAdd As Boolean
Dim strA() As String
Dim strB() As String
Dim strResult() As String
Dim strLen As Integer
On Error GoTo Err_Exit
tmpA$ = sHexA$
tmpB$ = sHexB$
bAdd = False
i = InStr(UCase$(sHexA$), "&H")
If i <> 0 Then
tmpA$ = Right$(Trim$(sHexA$), Len(sHexA$) - 2)
End If
i = InStr(UCase$(sHexB$), "&H")
If i <> 0 Then
tmpB$ = Right$(Trim$(sHexB$), Len(sHexB$) - 2)
End If
If Len(tmpA$) > Len(tmpB$) Then
strLen = Len(tmpA$)
tmpB$ = String(Len(tmpA$) - Len(tmpB$), "0") + tmpB$
Else
strLen = Len(tmpB$)
tmpA$ = String(Len(tmpB$) - Len(tmpA$), "0") + tmpA$
End If
ReDim strA$(1 To strLen)
ReDim strB$(1 To strLen)
For i = 1 To strLen
strA$(i) = Mid(tmpA$, i, 1)
strB$(i) = Mid(tmpB$, i, 1)
Next
Dim tmp$
ReDim strResult$(0 To strLen)
For i = strLen To 1 Step -1
If bAdd Then
tmp$ = Hex(CDec("&H" + strA$(i)) + CDec("&H" + strB$(i)) + 1)
Else
tmp$ = Hex(CDec("&H" + strA$(i)) + CDec("&H" + strB$(i)))
End If
If Len(tmp$) > 1 Then
bAdd = True
Else
bAdd = False
End If
strResult$(i) = Right$(tmp$, 1)
Next
If Len(tmp$) > 1 Then
strResult(i) = "1"
End If
tmp$ = ""
For i = 0 To strLen
tmp$ = tmp$ + strResult(i)
Next
'HexAdd = "&H" + tmp$
HexAdd = tmp$
Exit Function
Err_Exit:
HexAdd = ""
End Function