'函式功能:轉一個長整型數值 存放在一個陣列中
Public Function ShutoShuzu(shu As Long, ByRef shuzu() As Byte, beg As Byte, zijie As Byte, Optional mode As Byte = 0) As Boolean '將一個LONG型數值放置到一個4位元組陣列中
On Error GoTo Errc
' 引數 1、shu 為要轉存的長整數, 2、shuzu 為shu轉化后存放的陣列, 3、beg 存放在陣列中的起始位置
' 4、zijie 要在陣列中存放幾個位元組 5、mode 存放順序
Dim a As String, sP4 As String, sP3 As String, sP2 As String, sP1 As String
Dim B As Byte, c As String
ShutoShuzu = False
a = hex(shu)
B = Len(a)
Select Case B
Case 1
c = "0000000" & a
Case 2
c = "000000" & a
Case 3
c = "00000" & a
Case 4
c = "0000" & a
Case 5
c = "000" & a
Case 6
c = "00" & a
Case 7
c = "0" & a
Case 8
c = a
Case Else
Exit Function
End Select
sP1 = Mid(c, 1, 2) ' 數的頭高2位
sP2 = Mid(c, 3, 2) ' 數的次高2位
sP3 = Mid(c, 5, 2) ' 數的次低2位
sP4 = Mid(c, 7, 2) ' 數的最低2位
If zijie <> 1 And zijie <> 2 And zijie <> 3 And zijie <> 4 Then Exit Function
If mode <> 0 And mode <> 1 Then Exit Function
' mode =0 順序 與 長整型數在內容中存放順序相同 數的高位元組在 記憶體高址 低位元組在記憶體低址
' 位元組為1: Buffer(0)-sP4
' 位元組為2: Buffer(0)-sP4 Buffer(1)-sP3
' 位元組為3: Buffer(0)-sP4 Buffer(1)-sP3 Buffer(2)-sP2
' 位元組為4: Buffer(0)-sP4 Buffer(1)-sP3 Buffer(2)-sP2 Buffer(3)-sP1
If mode = 0 Then
Select Case zijie
Case 1
shuzu(beg) = Val("&h" & sP4)
Case 2
shuzu(beg) = Val("&h" & sP4)
shuzu(beg + 1) = Val("&h" & sP3)
Case 3
shuzu(beg) = Val("&h" & sP4)
shuzu(beg + 1) = Val("&h" & sP3)
shuzu(beg + 2) = Val("&h" & sP2)
Case 4
shuzu(beg) = Val("&h" & sP4)
shuzu(beg + 1) = Val("&h" & sP3)
shuzu(beg + 2) = Val("&h" & sP2)
shuzu(beg + 3) = Val("&h" & sP1)
End Select
End If
' mode =1 與 長整型數在內容中存放順序相反 數的高位元組在 記憶體低址 低位元組在記憶體高址
' 位元組為1: Buffer(0)-sP4
' 位元組為2: Buffer(0)-sP3 Buffer(1)-sP4
' 位元組為3: Buffer(0)-sP2 Buffer(1)-sP3 Buffer(2)-sP4
' 位元組為4: Buffer(0)-sP1 Buffer(1)-sP2 Buffer(2)-sP3 Buffer(3)-sP4
If mode = 1 Then
Select Case zijie
Case 1
shuzu(beg) = Val("&h" & sP4)
Case 2
shuzu(beg) = Val("&h" & sP3)
shuzu(beg + 1) = Val("&h" & sP4)
Case 3
shuzu(beg) = Val("&h" & sP2)
shuzu(beg + 1) = Val("&h" & sP3)
shuzu(beg + 2) = Val("&h" & sP4)
Case 4
shuzu(beg) = Val("&h" & sP1)
shuzu(beg + 1) = Val("&h" & sP2)
shuzu(beg + 2) = Val("&h" & sP3)
shuzu(beg + 3) = Val("&h" & sP4)
End Select
End If
ShutoShuzu = True
Exit Function
Errc:
ShutoShuzu = False
MsgBox ERR.Description
End Function
uj5u.com熱心網友回復:
代碼基本上沒錯,只是寫得比較差勁。我先按你的想法,給你稍微“優化”一下:
'函式功能:轉一個長整型數值 存放在一個陣列中
Public Function ShutoShuzu(shu As Long, ByRef shuzu() As Byte, beg As Byte, zijie As Byte, Optional mode As Byte = 0) As Boolean
'將一個LONG型數值放置到一個4位元組陣列中
On Error GoTo Errc
' 引數 1、shu 為要轉存的長整數
' 2、shuzu 為shu轉化后存放的陣列,
' 3、beg 存放在陣列中的起始位置
' 4、zijie 要在陣列中存放幾個位元組
' 5、mode 存放順序
Dim a As String, sP4 As String, sP3 As String, sP2 As String, sP1 As String
Dim B As Byte, c As String
ShutoShuzu = False
a = Hex(shu)
'B = Len(a)
'Select Case B
' Case 1
' c = "0000000" & a
' Case 2
' c = "000000" & a
' Case 3
' c = "00000" & a
' Case 4
' c = "0000" & a
' Case 5
' c = "000" & a
' Case 6
' c = "00" & a
' Case 7
' c = "0" & a
' Case 8
' c = a
' Case Else
' Exit Function
'End Select
c = Right$("0000000" & Hex$(shu), 8) ' 只這句,就搞定你前面的一長串了
sP1 = Mid$(c, 1, 2) ' 數的頭高2位
sP2 = Mid$(c, 3, 2) ' 數的次高2位
sP3 = Mid$(c, 5, 2) ' 數的次低2位
sP4 = Mid$(c, 7, 2) ' 數的最低2位
'If zijie <> 1 And zijie <> 2 And zijie <> 3 And zijie <> 4 Then Exit Function
If (zijie < 1 Or zijie > 4) Then Exit Function '盡量減少邏輯運算的數量
'If mode <> 0 And mode <> 1 Then Exit Function
If (mode And 254) Then Exit Function ' 這樣就只剩下 0和1 兩種情況了!!!
' mode =0 順序 與 長整型數在內容中存放順序相同 數的高位元組在 記憶體高址 低位元組在記憶體低址
' 位元組為1: Buffer(0)-sP4
' 位元組為2: Buffer(0)-sP4 Buffer(1)-sP3
' 位元組為3: Buffer(0)-sP4 Buffer(1)-sP3 Buffer(2)-sP2
' 位元組為4: Buffer(0)-sP4 Buffer(1)-sP3 Buffer(2)-sP2 Buffer(3)-sP1
If mode = 0 Then
Select Case zijie
Case 1
shuzu(beg) = Val("&h" & sP4)
Case 2
shuzu(beg) = Val("&h" & sP4)
shuzu(beg + 1) = Val("&h" & sP3)
Case 3
shuzu(beg) = Val("&h" & sP4)
shuzu(beg + 1) = Val("&h" & sP3)
shuzu(beg + 2) = Val("&h" & sP2)
Case 4
shuzu(beg) = Val("&h" & sP4)
shuzu(beg + 1) = Val("&h" & sP3)
shuzu(beg + 2) = Val("&h" & sP2)
shuzu(beg + 3) = Val("&h" & sP1)
End Select
' End If
' ' mode =1 與 長整型數在內容中存放順序相反 數的高位元組在 記憶體低址 低位元組在記憶體高址
' ' 位元組為1: Buffer(0)-sP4
' ' 位元組為2: Buffer(0)-sP3 Buffer(1)-sP4
' ' 位元組為3: Buffer(0)-sP2 Buffer(1)-sP3 Buffer(2)-sP4
' ' 位元組為4: Buffer(0)-sP1 Buffer(1)-sP2 Buffer(2)-sP3 Buffer(3)-sP4
' If mode = 1 Then
Else
Select Case zijie
Case 1
shuzu(beg) = Val("&h" & sP4)
Case 2
shuzu(beg) = Val("&h" & sP3)
shuzu(beg + 1) = Val("&h" & sP4)
Case 3
shuzu(beg) = Val("&h" & sP2)
shuzu(beg + 1) = Val("&h" & sP3)
shuzu(beg + 2) = Val("&h" & sP4)
Case 4
shuzu(beg) = Val("&h" & sP1)
shuzu(beg + 1) = Val("&h" & sP2)
shuzu(beg + 2) = Val("&h" & sP3)
shuzu(beg + 3) = Val("&h" & sP4)
End Select
End If
ShutoShuzu = True
Exit Function
Errc:
'ShutoShuzu = False '這兒用不著了,函式入口已經賦值了
MsgBox Err.Description
End Function
uj5u.com熱心網友回復:
剛注意到,你的 a = Hex(shu) 那句也用不著了,沒注釋掉。你的代碼中,用了不少的字串與數值的相互轉換。
這樣比較影響運行效率。
我給你重新寫一個,你可以參考一下:
'單個的數值引數,最好用Long,或者用 Integer
Public Function ShutoShuzu(shu As Long, ByRef shuzu() As Byte, beg As Long, zijie As Long, Optional mode As Long = 0) As Boolean
Dim lMASK As Long, lDIV As Long
Dim i&, j&, p&
On Error GoTo Errc
ShutoShuzu = False
If (zijie < 1 Or zijie > 4) Then Exit Function
If (mode And -2&) Then Exit Function
p = beg
If (mode = 0&) Then
lMASK = -1
lDIV = 1
For i = 1 To zijie
shuzu(p) = (shu And lMASK) \ lDIV And 255
If (i And 3) Then lMASK = lMASK * 256
lDIV = (lDIV And &HFFFFFF) * 256
p = p + 1
Next
Else
lMASK = &HFF000000
lDIV = &H1000000
For i = 1 To zijie
shuzu(p) = (shu And lMASK) \ lDIV And 255
lMASK = lMASK \ 256
lDIV = lDIV \ 256
p = p + 1
Next
End If
ShutoShuzu = True
Exit Function
Errc:
MsgBox Err.Description, vbExclamation
End Function
uj5u.com熱心網友回復:
如果你呼叫時,能確保傳入的引數 beg 的值合法、并且不會造成陣列下標溢位,那么,我那個代碼中, On Error GoTo 及相關的幾個陳述句都可以不要。
uj5u.com熱心網友回復:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Function ShutoShuzu(shu As Long, ByRef shuzu() As Byte, beg As Byte, zijie As Byte, Optional mode As Byte = 0) As Boolean
Dim bytBuff(3) As Byte, bytTmp As Byte, i As Integer, j As Integer
If (zijie > 4) Or (beg + zijie > Ubond(shuzu)) Then
Exit Function
End If
CopyMemory bytBuff, shu, 4
If mode Then
bytTmp = bytBuff(1)
bytBuff(1) = bytBuff(4)
bytBuff(4) = bytTmp
bytTmp = bytBuff(2)
bytBuff(2) = bytBuff(3)
bytBuff(3) = bytTmp
End If
j = 0
For i = beg To beg + zijie - 1
shuzu(i) = bytBuff(j)
j = j + 1
Next i
ShutoShuzu = True
End Function
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/147843.html
標籤:VB基礎類
上一篇:VB和SQL應用問題
