Public Sub BitSet(ByRef vData As Byte, ByRef Index As Integer)
Dim iByte
If Index > 7 Then
msgbox "Error"
Exit Sub
End If
iByte = Array(&H80, &H40, &H20, &H10, &H8, &H4, &H2, &H1)
vData = vData Or iByte(Index)
End SubPublic Sub BitCut(ByRef vData As Byte, ByRef Index As Integer)
Dim iByte
If Index > 7 Then
msgbox "Error"
Exit Sub
End If
iByte = Array(&H7F, &HBF, &HDF, &HEF, &HF7, &HFB, &HFD, &HFE)
vData = vData And iByte(Index)
End SubPublic Function BitGet(ByRef vData As Byte, ByRef Index As Integer) As Boolean
Dim iByte
If Index > 7 Then
msgbox "Error"
Exit Function
End If
iByte = Array(&H80, &H40, &H20, &H10, &H8, &H4, &H2, &H1)
BitGet = vData And iByte(Index)
End Function拿这个改改就可以实现位移了阿
Dim iByte
If Index > 7 Then
msgbox "Error"
Exit Sub
End If
iByte = Array(&H80, &H40, &H20, &H10, &H8, &H4, &H2, &H1)
vData = vData Or iByte(Index)
End SubPublic Sub BitCut(ByRef vData As Byte, ByRef Index As Integer)
Dim iByte
If Index > 7 Then
msgbox "Error"
Exit Sub
End If
iByte = Array(&H7F, &HBF, &HDF, &HEF, &HF7, &HFB, &HFD, &HFE)
vData = vData And iByte(Index)
End SubPublic Function BitGet(ByRef vData As Byte, ByRef Index As Integer) As Boolean
Dim iByte
If Index > 7 Then
msgbox "Error"
Exit Function
End If
iByte = Array(&H80, &H40, &H20, &H10, &H8, &H4, &H2, &H1)
BitGet = vData And iByte(Index)
End Function拿这个改改就可以实现位移了阿
这道题有两大难关,第一,scanf("%02x",&byte[i]);这条语句的转换.在这条语句里,C是按照十六进制每次两个字符的规则读取数据,在VB里,十六进制只能存放在字符串变量里,其他的统统会自动转换成为十进制.这些都不管了,在进行了复杂的十六进制基数判断、空格判断、空字符串判断以及限制了字符的取值以后,好歹把输入的东西按照C的格式以十进制存入了VB的Long数组。
然而,致命的伤是在第二难关:iTemp ^= (byte[i]<<8);VB不能进行移位操作。在C里,只要声明了数据类型,左右移位只是把高、低位的字节给挤出去,以至于看起来像乘以某数、除以某数一样,其实根本不是那么回事,比如,3435973836(10)这个unsigned int类型的数(这个数是VC++编译器初始来的,我在这里又知道了一点,就是如果用unsigned int byte[100];这种方式声明数组的话,那么没有赋值的元素编译器都给赋OxCCCCCCCC,如果用unsigned int byte[100]={10,20};这种方式初始化的话,那么其他元素就都初始化为0),十六进制表示为OxCCCCCCCC(16),左移8位后,VC++编译器中得到的结果是OxCCCCCC00(16),十进制就是3435973632(10),呵呵,在VB里无法移位,只能用乘以16的办法来得到10进制的数,结果很明显,溢出。这只是移位的问题,还有异或的问题,C里异或是^,VB里是Xor,但是由于VB的限制,那种超级大数异或的结果还是溢出。
所以,我失败了。
或者还有更高明的办法可以解决这个问题,但是我的水平仅限于此,无法看得更远了。
我自己也收获不少,至少对VC++的编译器熟悉了很多(我是在VB那边混的):),也把VB的位操作彻底搞清楚了,呵呵,还不算亏本。
贴主,祝你好运!
我上面的函数稍微改一下就可以实现VB里面Byte数据的位移
BitSet是设置Byte数据里面的某一位为1,BitCut是设置Byte数据里面的某一位为0,还有一个BitGet是得到Byte数家里面某位数据为1或者0.这样不就可以了么。实际上的long类型的数据是4个Byte也就是32个Bit,使用循环不就可以解决了么。这样就可以做一个VB的位移的函数么。
不要给你提供的方法不去用。
Option ExplicitPrivate Type MyType
Val(0 To 3) As Byte
End Type'iCount是vData的长度,满足是2的倍数
Public Function MyFunc(iCount As Integer, vData As String) As String
Dim tmpByte As MyType
Dim tmpByte2 As MyType
Dim i, j, k As Integer
Dim tBuf() As MyType
Dim tmpStr As String
Dim flag As Boolean
tmpByte2.Val(3) = 1
tmpByte2.Val(2) = 0
tmpByte2.Val(1) = 2
tmpByte2.Val(0) = 1
ReDim tBuf(0 To iCount / 2) As MyType
For i = 0 To i < iCount Step 2 '将字符串里面的数据转换为Byte数组
tBuf(i).Val(3) = 0
tBuf(i).Val(2) = CByte("&H0" + Mid(vData, i + 1, 1))
tBuf(i).Val(1) = CByte("&H0" + Mid(vData, i + 2, 1))
tBuf(i).Val(0) = 0
Next
For i = 0 To iCount / 2
'左移8位
tBuf(i).Val(3) = tBuf(i).Val(2)
tBuf(i).Val(2) = tBuf(i).Val(1)
tBuf(i).Val(1) = tBuf(i).Val(0)
tBuf(i).Val(0) = 0
'由高到低进行异或异或
For j = 7 To 0 Step -1
For k = 3 To 0 Step -1
If BitGet(tmpByte.Val(k), j) = BitGet(tBuf(i).Val(k), j) Then '相同置0
BitCut tmpByte.Val(k), j
Else
BitSet tmpByte.Val(k), j
End If
Next
Next
'8次重复运算
For j = 0 To 7
flag = BitGet(tmpByte.Val(3), 7) '取最高位
'左移1位
For k = 3 To 0 Step -1
For l = 6 To 0
If BitGet(tmpByte.Val(k), l) = True Then
BitSet tmpByte.Val(k), l + 1
Else
BitCut tmpByte.Val(k), l + 1
End If
Next
Next
'左移1位Byte之间移位
If BitGet(tmpByte.Val(2), 7) = True Then
BitSet tmpByte.Val(3), 0
Else
BitCut tmpByte.Val(3), 0
End If
If BitGet(tmpByte.Val(1), 7) = True Then
BitSet tmpByte.Val(2), 0
Else
BitCut tmpByte.Val(2), 0
End If
If BitGet(tmpByte.Val(0), 7) = True Then
BitSet tmpByte.Val(1), 0
Else
BitCut tmpByte.Val(1), 0
End If
If flag = True Then
'与0x1021异或
For j = 7 To 0 Step -1
For k = 3 To 0 Step -1
If BitGet(tmpByte.Val(k), j) = BitGet(tmpByte2(i).Val(k), j) Then '相同置0
BitCut tmpByte.Val(k), j
Else
BitSet tmpByte.Val(k), j
End If
Next
Next
End If
Next
Next
'返回值
MyFunc = CStr(tmpByte.Val(3) + tmpByte.Val(2) + tmpByte.Val(1) + tmpByte.Val(0))
End FunctionPublic Sub BitSet(ByRef vData As Byte, ByRef Index As Integer)
Dim iByte
If Index > 7 Then
RaiseEvent RecvErr(0, "BitSet", "Index范围错误" + CStr(Index), "", "")
Err.Raise 0, "BitSet", "Index范围错误" + CStr(Index)
Exit Sub
End If
iByte = Array(&H80, &H40, &H20, &H10, &H8, &H4, &H2, &H1)
vData = vData Or iByte(Index)
End SubPublic Sub BitCut(ByRef vData As Byte, ByRef Index As Integer)
Dim iByte
If Index > 7 Then
RaiseEvent RecvErr(0, "BitCut", "Index范围错误" + CStr(Index), "", "")
Err.Raise 0, "BitCut", "Index范围错误" + CStr(Index)
Exit Sub
End If
iByte = Array(&H7F, &HBF, &HDF, &HEF, &HF7, &HFB, &HFD, &HFE)
vData = vData And iByte(Index)
End SubPublic Function BitGet(ByRef vData As Byte, ByRef Index As Integer) As Boolean
Dim iByte
If Index > 7 Then
RaiseEvent RecvErr(0, "BitGet", "Index范围错误" + CStr(Index), "", "")
Err.Raise 0, "BitGet", "Index范围错误" + CStr(Index)
Exit Function
End If
iByte = Array(&H80, &H40, &H20, &H10, &H8, &H4, &H2, &H1)
BitGet = vData And iByte(Index)
End Function源程序的VB函数替换
·································