发信人: zkboy (小小鸟), 信区: VisualBasic
标 题: Re: 请教:如何在VB中实现16进制数或10进制数与2进制�
发信站: BBS 水木清华站 (Thu Jun 15 19:39:37 2000)
转一篇相关资料
在编程中,我们经常使用二进制(binary)、八进制(octal)、十进制(decimal)和十
六进制(hexadecimal)来表示一个数据,除二进制可表示大部分数据外,我们一般用其他
的进制来表示整型数。它们之间的转换有时显得非常重要,但VB本身提供的转换函数很
少。这样,就需要我们根据VB程序的特点自己来设计转换函数。以下向大家介绍几种转
换方法,虽然不能放之四海皆准,瑾希望能激发您的思路。
一、VB提供的进制转换函数
1、Hex(x)
返回十六进制数值的String类型,注意
(1)其返回的是String类型;
(2)函数返回值最多是8个十六进制字符;
(3)x为整数,如果x不是整数将先被四舍五入成最接近的整数。
2、Oct(x)
返回八进制数值的 Variant(String)类型,注意
(2)函数返回值最多是11个八进制字符;
(3)x为整数,如果x不是整数将先被四舍五入成最接近的整数。
VB只有这两个进制转换函数。
二、自己设计转换函数
1、十六进制 -> 十进制 :
lngDec = CLng("&H" & strHex)
你看,仅这么一个表达式就能完成转换。为什么用Clng( )而不用Val( )?这只是为了避
免数值范围的限制。
2、八进制 -> 十进制 :
提示,VB中八进制数以&O为前缀,通过上面您一定能写出转换表达式。
3、十六进制 -> 二进制 :
Function Hex2Bin(HexValue As String) As String
Const BinIndexTable = "0000000100100011010001010110011110001001101010111
100110111101111"
Dim n As Integer
Dim Tmp As String
Tmp = ""
For n = 1 To Len(HexValue)
Tmp = Tmp + Mid(BinIndexTable, _
(Val("&H" + Mid(HexValue, n, 1) - 1) * 4 + 1), 4)
Next
Hex2Bin = Tmp
End Function
我们知道1位十六进制数代表4位二进制。这里用到一个索引表BinIndexTable,经过对给
定的十六进制数逐位分离、检索索引表、转换、合并,就可以得到结果。和前面的转换
比较,这里用到了Val( )函数,因为保证的前提是1位十六进制最大表示为十进制的15。
是看起来这种方法很原始,但它是最简便的,并且运行速度最快。
4、用两个函数来完成各种进制间的转换:
Function ConvertBase(NumValue As String, BaseFrom As Integer, BaseTo As Inte
ger) _
As String
' 转换一个数值(NumValue)从一种进制(BaseFrom)到另一种进制(BaseTo)
'
' 用一个整数来表示各种进制:
' 二进制 = 2
' 八进制 = 8
' 十进制 = 10
' 十六进制 = 16
'
' NumValue是给定的数值字符串,包括 0 - 9, A - Z
' BaseFrom是给定的数值的进制,可以是2与36间的任何整数
' BaseTo是希望转换成的进制,可以是2与36间的任何整数
'
' 函数返回希望得到的进制数,是一个String类型
Dim i As Integer
Dim PlaceValue As Integer
Dim CurrentCharacter As String
Dim CharacterValue As Integer
Dim RunningTotal As Double
Dim Remainder As Double
Dim BaseOutDouble As Double
Dim NumInCaps As String
'确认NumValue有效
If NumValue = "" Or BaseFrom < 2 Or BaseFrom > 36 _
Or BaseTo < 1 Or BaseTo > 36 Then
ConvertBase = "Error"
Exit Function
End If
'使字母为大写
NumInCaps = UCase(NumValue)
'先将给定的数转换为十进制
PlaceValue = Len(NumInCaps)
For i = 1 To Len(NumInCaps)
PlaceValue = PlaceValue - 1
CurrentCharacter = Mid(NumInCaps, i, 1)
CharacterValue = 0
If Asc(CurrentCharacter) > 64 And _
Asc(CurrentCharacter) < 91 Then
CharacterValue = Asc(CurrentCharacter) - 55
End If
If CharacterValue = 0 Then
If Asc(CurrentCharacter) < 48 Or _
Asc(CurrentCharacter) > 57 Then
ConvertBase = "Error"
Exit Function
Else
CharacterValue = Val(CurrentCharacter)
End If
End If
If CharacterValue < 0 Or CharacterValue > BaseFrom - 1 Then
ConvertBase = "Error"
Exit Function
End If
RunningTotal = RunningTotal + CharacterValue * (BaseFrom ^ PlaceValue)
Next i
' 将得到的十进制数转换为目标进制
Do
BaseOutDouble = CDbl(BaseTo)
Remainder = ModDouble(RunningTotal, BaseOutDouble)
RunningTotal = (RunningTotal - Remainder) / BaseTo
If Remainder >= 10 Then
CurrentCharacter = Chr(Remainder + 55)
Else
CurrentCharacter = Right(Str(Remainder), _
Len(Str(Remainder)) - 1)
End If
ConvertBase = CurrentCharacter & ConvertBase
Loop While RunningTotal > 0
End Function
Function ModDouble(NumValue As Double, DivNum As Double) As Double
'返回一个由小数点分开的数,用语Double数据类型
ModDouble = NumValue - (Int(NumValue / DivNum) * DivNum)
End Function
这里的自定义函数能很好的完成转换的任务,尤其是可以转换Double数据类型,这点在
使用Windows注册表编程时很有用(转换DWords)。代码很复杂,需要脑子不停的转动,
请您仔细理解。其实这只是一个通用的函数,您可以提取思路用于自己的特定功能。
调用方法:
Dim theValue As String
'十进制 -> 十六进制
theValue = ConvertBase("100", 10, 16)
'二进制 -> 八进制
theValue = ConvertBase("100", 2, 8)
'十进制 -> 三进制
theValue = ConvertBase("100", 10, 3)
【 在 suliangfeng (疯子) 的大作中提到: 】
: 我需要把一10进制的数转为2进制,然后提取低7位,请问如何实现,谢谢!
标 题: Re: 请教:如何在VB中实现16进制数或10进制数与2进制�
发信站: BBS 水木清华站 (Thu Jun 15 19:39:37 2000)
转一篇相关资料
在编程中,我们经常使用二进制(binary)、八进制(octal)、十进制(decimal)和十
六进制(hexadecimal)来表示一个数据,除二进制可表示大部分数据外,我们一般用其他
的进制来表示整型数。它们之间的转换有时显得非常重要,但VB本身提供的转换函数很
少。这样,就需要我们根据VB程序的特点自己来设计转换函数。以下向大家介绍几种转
换方法,虽然不能放之四海皆准,瑾希望能激发您的思路。
一、VB提供的进制转换函数
1、Hex(x)
返回十六进制数值的String类型,注意
(1)其返回的是String类型;
(2)函数返回值最多是8个十六进制字符;
(3)x为整数,如果x不是整数将先被四舍五入成最接近的整数。
2、Oct(x)
返回八进制数值的 Variant(String)类型,注意
(2)函数返回值最多是11个八进制字符;
(3)x为整数,如果x不是整数将先被四舍五入成最接近的整数。
VB只有这两个进制转换函数。
二、自己设计转换函数
1、十六进制 -> 十进制 :
lngDec = CLng("&H" & strHex)
你看,仅这么一个表达式就能完成转换。为什么用Clng( )而不用Val( )?这只是为了避
免数值范围的限制。
2、八进制 -> 十进制 :
提示,VB中八进制数以&O为前缀,通过上面您一定能写出转换表达式。
3、十六进制 -> 二进制 :
Function Hex2Bin(HexValue As String) As String
Const BinIndexTable = "0000000100100011010001010110011110001001101010111
100110111101111"
Dim n As Integer
Dim Tmp As String
Tmp = ""
For n = 1 To Len(HexValue)
Tmp = Tmp + Mid(BinIndexTable, _
(Val("&H" + Mid(HexValue, n, 1) - 1) * 4 + 1), 4)
Next
Hex2Bin = Tmp
End Function
我们知道1位十六进制数代表4位二进制。这里用到一个索引表BinIndexTable,经过对给
定的十六进制数逐位分离、检索索引表、转换、合并,就可以得到结果。和前面的转换
比较,这里用到了Val( )函数,因为保证的前提是1位十六进制最大表示为十进制的15。
是看起来这种方法很原始,但它是最简便的,并且运行速度最快。
4、用两个函数来完成各种进制间的转换:
Function ConvertBase(NumValue As String, BaseFrom As Integer, BaseTo As Inte
ger) _
As String
' 转换一个数值(NumValue)从一种进制(BaseFrom)到另一种进制(BaseTo)
'
' 用一个整数来表示各种进制:
' 二进制 = 2
' 八进制 = 8
' 十进制 = 10
' 十六进制 = 16
'
' NumValue是给定的数值字符串,包括 0 - 9, A - Z
' BaseFrom是给定的数值的进制,可以是2与36间的任何整数
' BaseTo是希望转换成的进制,可以是2与36间的任何整数
'
' 函数返回希望得到的进制数,是一个String类型
Dim i As Integer
Dim PlaceValue As Integer
Dim CurrentCharacter As String
Dim CharacterValue As Integer
Dim RunningTotal As Double
Dim Remainder As Double
Dim BaseOutDouble As Double
Dim NumInCaps As String
'确认NumValue有效
If NumValue = "" Or BaseFrom < 2 Or BaseFrom > 36 _
Or BaseTo < 1 Or BaseTo > 36 Then
ConvertBase = "Error"
Exit Function
End If
'使字母为大写
NumInCaps = UCase(NumValue)
'先将给定的数转换为十进制
PlaceValue = Len(NumInCaps)
For i = 1 To Len(NumInCaps)
PlaceValue = PlaceValue - 1
CurrentCharacter = Mid(NumInCaps, i, 1)
CharacterValue = 0
If Asc(CurrentCharacter) > 64 And _
Asc(CurrentCharacter) < 91 Then
CharacterValue = Asc(CurrentCharacter) - 55
End If
If CharacterValue = 0 Then
If Asc(CurrentCharacter) < 48 Or _
Asc(CurrentCharacter) > 57 Then
ConvertBase = "Error"
Exit Function
Else
CharacterValue = Val(CurrentCharacter)
End If
End If
If CharacterValue < 0 Or CharacterValue > BaseFrom - 1 Then
ConvertBase = "Error"
Exit Function
End If
RunningTotal = RunningTotal + CharacterValue * (BaseFrom ^ PlaceValue)
Next i
' 将得到的十进制数转换为目标进制
Do
BaseOutDouble = CDbl(BaseTo)
Remainder = ModDouble(RunningTotal, BaseOutDouble)
RunningTotal = (RunningTotal - Remainder) / BaseTo
If Remainder >= 10 Then
CurrentCharacter = Chr(Remainder + 55)
Else
CurrentCharacter = Right(Str(Remainder), _
Len(Str(Remainder)) - 1)
End If
ConvertBase = CurrentCharacter & ConvertBase
Loop While RunningTotal > 0
End Function
Function ModDouble(NumValue As Double, DivNum As Double) As Double
'返回一个由小数点分开的数,用语Double数据类型
ModDouble = NumValue - (Int(NumValue / DivNum) * DivNum)
End Function
这里的自定义函数能很好的完成转换的任务,尤其是可以转换Double数据类型,这点在
使用Windows注册表编程时很有用(转换DWords)。代码很复杂,需要脑子不停的转动,
请您仔细理解。其实这只是一个通用的函数,您可以提取思路用于自己的特定功能。
调用方法:
Dim theValue As String
'十进制 -> 十六进制
theValue = ConvertBase("100", 10, 16)
'二进制 -> 八进制
theValue = ConvertBase("100", 2, 8)
'十进制 -> 三进制
theValue = ConvertBase("100", 10, 3)
【 在 suliangfeng (疯子) 的大作中提到: 】
: 我需要把一10进制的数转为2进制,然后提取低7位,请问如何实现,谢谢!