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拿这个改改就可以实现位移了阿

解决方案 »

  1.   

    用integer类型,想以乘2的办法。但带有符号,结果就溢出了。
      

  2.   

    唉,我失算了,这道题我从中午就一直在做,克服重重困难,终于功亏一篑,我失败了.现在是凌晨1:42
        这道题有两大难关,第一,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的位操作彻底搞清楚了,呵呵,还不算亏本。
        贴主,祝你好运!
      

  3.   

    可以用Byte来进行转换么
    我上面的函数稍微改一下就可以实现VB里面Byte数据的位移
    BitSet是设置Byte数据里面的某一位为1,BitCut是设置Byte数据里面的某一位为0,还有一个BitGet是得到Byte数家里面某位数据为1或者0.这样不就可以了么。实际上的long类型的数据是4个Byte也就是32个Bit,使用循环不就可以解决了么。这样就可以做一个VB的位移的函数么。
    不要给你提供的方法不去用。
      

  4.   

    ·································
    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函数替换
    ·································