技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 1187
|
本帖最后由 wang1999 于 2015-8-25 19:05 編輯
這是我剛開(kāi)始學(xué)VBA時(shí)寫的, 結(jié)構(gòu)清晰, 看著清爽. 還算不錯(cuò). 只是性能方面,現(xiàn)在看來(lái)不敢恭維。- Public Function BinToHex(ByVal Bin As String) As String
- Dim i As Long
- i = Len(Bin) Mod 4
- If i <> 0 Then '按每組4個(gè)二進(jìn)制字符配齊
- Bin = String(4 - i, "0") & Bin
- End If
- For i = 1 To Len(Bin) Step 4
- Select Case Mid$(Bin, i, 4)
- Case "0000": BinToHex = BinToHex & "0"
- Case "0001": BinToHex = BinToHex & "1"
- Case "0010": BinToHex = BinToHex & "2"
- Case "0011": BinToHex = BinToHex & "3"
- Case "0100": BinToHex = BinToHex & "4"
- Case "0101": BinToHex = BinToHex & "5"
- Case "0110": BinToHex = BinToHex & "6"
- Case "0111": BinToHex = BinToHex & "7"
- Case "1000": BinToHex = BinToHex & "8"
- Case "1001": BinToHex = BinToHex & "9"
- Case "1010": BinToHex = BinToHex & "A"
- Case "1011": BinToHex = BinToHex & "B"
- Case "1100": BinToHex = BinToHex & "C"
- Case "1101": BinToHex = BinToHex & "D"
- Case "1110": BinToHex = BinToHex & "E"
- Case "1111": BinToHex = BinToHex & "F"
- End Select
- Next
- End Function
復(fù)制代碼
下面這個(gè)是我的VBA最終版,帶錯(cuò)誤檢查, 帶占位符的. 測(cè)后速度 191967.953
Public Function BinToHexV5(BinString As String, Optional ByVal Places As Long = 8) As String
Dim i As Long, lLen As Long
Static sacurBinStr(1 To 8) As Currency, aiRetStr(1 To 8) As Integer, sai0Str(1 To 8) As Integer
'//1.初始化
'初始化字符串=8個(gè)"0" '判斷語(yǔ)句不作比較時(shí), Integer 比 long 要快
If sai0Str(1) Then Else sai0Str(1) = 48: sai0Str(2) = 48: sai0Str(3) = 48: sai0Str(4) = 48: sai0Str(5) = 48: sai0Str(6) = 48: sai0Str(7) = 48: sai0Str(8) = 48
CopyMem16 aiRetStr(1), sai0Str(1)
'參數(shù)檢查
lLen = LenB(BinString) '后面復(fù)制時(shí)單位為字節(jié), 所以為 LenB
If lLen > 64& Then Err.Raise erCom + 3, "BinToHex", "參數(shù)過(guò)長(zhǎng)": Exit Function
If lLen = 0& Then Err.Raise erCom + 4, "BinToHex", "空參數(shù)": Exit Function
i = (lLen + 7&) \ 8& '取得 BinString 的16進(jìn)制最高位的位置
If Places < 1& Or Places > 8& Then Places = i '超出范圍時(shí), 重定占位長(zhǎng)度
'復(fù)制 參數(shù)(BinString)到數(shù)組; VarPtr(sacurBinStr(8)) - lLen + 8: 字節(jié)對(duì)齊;
sacurBinStr(9 - i) = 1351100504368.7472@ '="0000", 將 BinString 按4位一組在高位補(bǔ)齊前導(dǎo)"0"字符串
MoveMemoryPtr2Ptr VarPtr(sacurBinStr(8)) - lLen + 8, BinString, lLen
'//2.轉(zhuǎn)換數(shù)據(jù). 遍歷字符串, 從高位開(kāi)始轉(zhuǎn)換; '處理 Places, 如果設(shè)置長(zhǎng)度過(guò)小或過(guò)大, 則輸出實(shí)際位數(shù)
For i = 9 - i To 8
Select Case sacurBinStr(i)
Case 1351100504368.7472@ '0000
aiRetStr(i) = 48 ' "0"
Case 1379248002039.8128@ '0001
aiRetStr(i) = 49 ' "1"
Case 1351100933865.4768@ '0010
aiRetStr(i) = 50 ' "2"
Case 1379248431536.5424@ '0011
aiRetStr(i) = 51 ' "3"
Case 1351100504375.3008@ '0100
aiRetStr(i) = 52 ' "4"
Case 1379248002046.3664@ '0101
aiRetStr(i) = 53 ' "5"
Case 1351100933872.0304@ '0110
aiRetStr(i) = 54 ' "6"
Case 1379248431543.096@ '0111
aiRetStr(i) = 55 ' "7"
Case 1351100504368.7473@ '1000
aiRetStr(i) = 56 ' "8"
Case 1379248002039.8129@ '1001
aiRetStr(i) = 57 ' "9"
Case 1351100933865.4769@ '1010
aiRetStr(i) = 65 ' "A"
Case 1379248431536.5425@ '1011
aiRetStr(i) = 66 ' "B"
Case 1351100504375.3009@ '1100
aiRetStr(i) = 67 ' "C"
Case 1379248002046.3665@ '1101
aiRetStr(i) = 68 ' "D"
Case 1351100933872.0305@ '1110
aiRetStr(i) = 69 ' "E"
Case 1379248431543.0961@ '1111
aiRetStr(i) = 70 ' "F"
Case Else
Err.Raise erCom + 5, "BinToHexV5", "類型不符合": Exit Function
End Select
Next
'返回?cái)?shù)據(jù)
BinToHexV5 = SysAllocStringLen(aiRetStr(1), Places)
End Function
|
|