VisualBasic 版 (精华区)
生活随笔
收集整理的這篇文章主要介紹了
VisualBasic 版 (精华区)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
發信人:?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位,請問如何實現,謝謝!
總結
以上是生活随笔為你收集整理的VisualBasic 版 (精华区)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改hostname有几种方式?
- 下一篇: C++设计模式——单例模式