算法是这样的 给你一个位数不确定的二进制数(大于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位的异或
就是先取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位的异或
' 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
100101100101 这是原始的A。取前5位对应下面的数
11001 这是要异或的数
-------
010111100101 这个是连接以后的结果(其中C是01011,就是前五位。而C是之前没取的,是第五位后面的)
11001
------------
01110100101
11001
-------------
0010000101
11001
------------
01001101
11001
--------------
0101101
11001
--------------
011111
11001
------------
00110
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
再加上循环控制就可以了。
参数n输入十进制数
不是有 Debug.Print 输出,请举例说明。
不是有 Debug.Print 输出,请举例说明。
我找到问题了。应该是》=9~~ 能不能加一下QQ 还有个小问题没解决
88498925
界面是这样的操作过程是这样的
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,其他都没数据
3.这时候点击去错按键(去掉Text2中的错误,就是恢复到之前修改的数),这时点击同步显示按键,我想要让界面恢复到之前正确的界面,就是恢复到如下
我写的中间变量是这样的
'加错按键,点击以后随机改变二进制数的其中一位
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是中间变量 这是加错按键的 但是我不知道怎么去恢复
Text2.Text = yuanshiA
建议你做个状态迁移图。
单个按钮(去错)点击后应该是什么状态,这样容易把握哪些数据需要保存/恢复。
连点按钮(去错、同步显示)后的状态不能说明问题。
单击(去错,同步显示)显示Text1,2,3中的数据和图 ,和之前输入一个数,单击同步显示的结果一样