算法是这样的 给你一个位数不确定的二进制数(大于9位,我们在这里称为A),对100110001做模2运算,算法我简单说一下
就是先取A的前9位,和100110001异或 ,然后得到一个数C,然后用C和A的剩下的几位连接&(就是与A取完9位以后剩下的字符),得到的数就是新的A,继续取新的A的前9位,进行异或(就是这里的循环不会)。直到新的A的位数等于9位停止。
我写的代码是这样的n=len(Text1.Text)
Q=Mid (Text1.Text,1,9)  '先去输入数字的前九位
s=0
For i =1 To 9
w=Mid (Q,i,1)     '这里是先把输入的二进制数转换为十进制
s=s+2^(n-i)*w
c=s Xor 305       '这里是A的二进制数和B的二进制数进行异或
next i
Do                ’这里是转换回二进制
ch = c Mod 2 & ch
c = c \ 2
Loop Until c = 0
SY= Mid (Text1.Text,10,n-9) '这里是取A中剩下的字符(就是取完前9位的)
NewQ = ch  & SY
写到这里就不知道怎么写了  因为写到这里想要继续做上面的异或
用新产生的Q就是NewQ 继续做取9位的异或

解决方案 »

  1.   

    写错了 最后一个应该不是NewQ  应该是NewA  意思就是新的Text1中的新的结果
      

  2.   

    Option ExplicitPrivate Function HexToBin(ByVal sHex As String) As String
    ' 16进制转2进制
        Const s1 As String = "0000101001101111000"
        Const s2 As String = "0125A4936DB7FEC8"
        Dim i As Long, sBin As String
        sHex = UCase(sHex)
        For i = 1 To Len(sHex)
            sBin = sBin & Mid$(s1, InStr(1, s2, Mid(sHex, i, 1)), 4)
        Next
        HexToBin = sBin
    End FunctionPrivate Function BinToHex(ByVal sBin As String) As String
    ' 2进制转16进制
        Const s1 As String = "0000101001101111000"
        Const s2 As String = "0125A4936DB7FEC8"
        Dim i As Long, sHex As String
        sBin = String$(3 - (Len(sBin) - 1) Mod 4, "0") & sBin
        For i = 1 To Len(sBin) Step 4
            sHex = sHex & Mid$(s2, InStr(1, s1, Mid(sBin, i, 4)), 1)
        Next
        BinToHex = sHex
    End Function
    Private Sub Command1_Click()
       Dim N&, M&, V&, p&
       Dim strBinVal$, strTemp$
       
       Call Randomize
       M = CLng("&H" & BinToHex("100110001"))    ' 预定义常数: 100110001
       'M = 305
       N = Rnd() * 9999999 + 512                 ' 随机产生一个合法数值
       'N = CLng("&H" & BinToHex(Text1.Text))    ' 如果你的数据是在Text1中输入的
       Do
          strTemp = HexToBin(Hex$(N))
          p = InStr(strTemp, "1")
          If (p) Then strBinVal = Mid$(strTemp, p)
          V = CLng("&H" & BinToHex(Left$(strBinVal, 9))) Xor M
          strTemp = HexToBin(Hex$(V))
          p = InStr(strTemp, "1")
          If (p) Then
             strBinVal = Mid$(strTemp, p) & Mid$(strBinVal, 10)
          Else
             strBinVal = Mid$(strBinVal, 10)
          End If
          If (Len(strBinVal) = 9) Then Exit Do
          N = CLng("&H" & BinToHex(strBinVal))
       Loop
       MsgBox strBinVal, 64                      ' 最终结果:strBinVal
    End Sub
      

  3.   

    然后用C和A的剩下的几位连接&(这个是什么意思,c和a剩下的再连接之后,不就和最原始的A的位数相同了,最后的A怎么可能到达9位? 
      

  4.   

    C是第一次异或完得到的数。A剩下的就是取完9位剩下的,我举个例子吧
    100101100101  这是原始的A。取前5位对应下面的数
    11001         这是要异或的数
    -------
    010111100101   这个是连接以后的结果(其中C是01011,就是前五位。而C是之前没取的,是第五位后面的)
     11001
    ------------
     01110100101
      11001
    -------------
      0010000101
        11001
    ------------
        01001101
         11001
    --------------
         0101101
          11001
    --------------
          011111
           11001
    ------------
           00110
      

  5.   

    Option ExplicitFunction BinVal(ByVal Q As String) As Long
        Dim v As Long
        Dim n As Long
        Dim w As Long
        Dim i As Long
        
        n = Len(Q)
        For i = 1 To n
            w = Mid(Q, i, 1)  '这里是先把输入的二进制数转换为十进制
            v = v + 2 ^ (n - i) * w
        Next i
        
        BinVal = v
    End FunctionFunction BinStr(ByVal C As Long) As String
        Dim ch As String
        Do                '这里是转换回二进制
            ch = C Mod 2 & ch
            C = C \ 2
        Loop Until C = 0
        
        BinStr = ch
    End FunctionPrivate Sub Command1_Click()
        Dim A As String
        Dim C As Long
        
        A = Text1.Text
        Debug.Print A
        While Len(A) > 9
            C = BinVal(Left$(A, 9)) Xor 305
            A = BinStr(C) & Mid$(A, 10)
            Debug.Print A
        Wend    Text1.Text = A
    End Sub
      

  6.   

    你原先的代码主要错误就是 Xor 调用的位置不对。
    再加上循环控制就可以了。
      

  7.   

    本帖最后由 bcrun 于 2013-05-20 20:16:23 编辑
      

  8.   

    Public Function CalculateIt(n As Long, sBase As String) As String
    参数n输入十进制数
      

  9.   

    这是拿你的代码改的,运算逻辑可没变!
    不是有 Debug.Print 输出,请举例说明。
      

  10.   

    这是拿你的代码改的,运算逻辑可没变!
    不是有 Debug.Print 输出,请举例说明。
    我找到问题了。应该是》=9~~ 能不能加一下QQ  还有个小问题没解决
    88498925
      

  11.   

    现在是这样的情况 
    界面是这样的操作过程是这样的
    1.从Text1中输入一个数据,然后点击同步显示,结果如下2.点击加错按钮,可以发现Text2中的数据随机一位改变,这时候点击同步显示,(因为出现错误)所以Text1和text3中数据不显示,图像也消失,重发指示亮红灯,如下3.这时候点击去错按键(去掉Text2中的错误,就是恢复到之前修改的数),这时点击同步显示按键,我想要让界面恢复到之前正确的界面,就是恢复到如下我 的代码是这样的
     '同步显示按钮
      Private Sub Command6_Click()
        Dim k As Integer
        Dim s As String
        Dim s1 As String
        Command8.Enabled = True '可以按下去错按键
        If (Command7.Enabled = True) Then
        '指示灯变绿色(应该恢复编码和解码以及对应的波形)
    Shape1.FillColor = vbGreen
     
        
       '当最后输入为源码编辑框时,同步更新显示
       If (fla1 = True And flb1 = False And flc1 = False) Then
            j = i: h = i
            
            Call Command4_Click
      
            Call Command1_Click
            fla = True: flb = True: flc = True
            Call Print_XY
       End If
       '当最后输入为编码编辑框时,同步更新显示
       If (fla1 = False And flb1 = True And flc1 = False) Then
            i = j: h = j
          
            Call Command1_Click
            For k = 1 To j
              a(k) = C(k)
            Next
            For k = 1 To j
               s1 = CStr(a(k))
               s = s & s1
            Next
            Text1.Text = s
            fla = True: flb = True: flc = True
            Call Print_XY
       End If
       '当最后输入为译码编辑框时,同步更新显示
       If (fla1 = False And flb1 = False And flc1 = True) Then
            i = h: j = h
            For k = 1 To h
              a(k) = C(k)
            Next
            For k = 1 To h
               s1 = CStr(a(k))
               s = s & s1
            Next
            Text1.Text = s
         
            Call Command4_Click
            fla = True: flb = True: flc = True
            Call Print_XY
       End If
     '判断编码改变了(点击加错,但是未点击去错时)
    Else
     '清除对应编码和译码
    Text1.Text = ""
     Text3.Text = ""
    '清除对应波形
      fla = False: flb = True: flc = False
            Call Print_XY
     '这时候指示灯变红,重发
    Shape1.FillColor = vbRedEnd If
    If (Text2.Text = z & T) Then
    Text1.Text = BL
    Text3.Text = BL
     fla = True: flb = True: flc = True
            Call Print_XY
            End If
     End Sub
     但是当运行步骤3时候  Text2中的数据变成0,其他都没数据
      

  12.   

    错了,对上面的3进行下修改
    3.这时候点击去错按键(去掉Text2中的错误,就是恢复到之前修改的数),这时点击同步显示按键,我想要让界面恢复到之前正确的界面,就是恢复到如下
      

  13.   

    【去错】时候不能直接恢复,要点一下同步显示才去恢复,而且这里的话 我不知道怎么去写代码 
    我写的中间变量是这样的
     '加错按键,点击以后随机改变二进制数的其中一位
    Private Sub Command7_Click()
    Dim NewA As StringDim ARight As String
    Dim ALeft As String
    Dim a As Integer
    Dim b As String
    Dim D As Integer 'd为Textbox中输入数的长度
      Dim yuanshi1 As String  '定义一个中间变量
      yuanshi1 = Text1.Text
    D = Len(Text1.Text)
    If (D = 0) Then
     MsgBox "请输入码元序列", vbInformation, "提示"
    Else
    yuanshiA = Text2.Text
    Command7.Enabled = False
    Randomize (Timer)
    a = Int(((D + 8) * Rnd) + 1)b = Mid(Text2.Text, a, 1)
    If b = 0 Then
      b = 1
    Else
      b = 0
    End IfALeft = Left(Text2.Text, a - 1)ARight = Right(Text2.Text, Len(Text2.Text) - a)NewA = ALeft & b & ARight
    Text2.Text = NewA
    End If
    End Sub
    只有中间的yuanshi1是中间变量  这是加错按键的 但是我不知道怎么去恢复
      

  14.   

    '去错
    Text2.Text = yuanshiA
    建议你做个状态迁移图。
    单个按钮(去错)点击后应该是什么状态,这样容易把握哪些数据需要保存/恢复。
    连点按钮(去错、同步显示)后的状态不能说明问题。
      

  15.   

    单击(去错)的时候,这时候只显示Text2中数据=yuanshiA
    单击(去错,同步显示)显示Text1,2,3中的数据和图 ,和之前输入一个数,单击同步显示的结果一样