我有以下VB函数,从德国Excel宏转换而来:
Function GetChecksumme(identNr As Integer) As BitArray
Dim Z1 As Integer ' {Hilfsz„hler 1}
Dim Checksumme As New BitArray(27)
Dim DoCoZahl As Long
Dim Result As New BitArray(6)
DoCoZahl = identNr
'Zeit fuer diesen Schritt starten:}
'Checksumme berechnen:}
'False = logisch 0, True = logisch 1}
'1. Schritt: Das Array 'CheckSumme' mit 26 Nullen auffuellen:}
For Z1 = 1 To 26
Checksumme(Z1) = False
Next Z1
'2. Schritt: DotCode-Zahl in duale Darstellung umrechnen und}
'links von den rechten 6 Nullen einschreiben:}
Z1 = 21
Do While DoCoZahl > 0
Z1 = Z1 - 1
If (DoCoZahl Mod 2) = 0 Then
Checksumme(Z1) = False
End If
If (DoCoZahl Mod 2) = 1 Then
Checksumme(Z1) = True
End If
DoCoZahl = DoCoZahl \ 2
Loop
'3. Schritt: Solange XOR-Operation durchfhren, bis}
'die Check-Summe ermittelt ist:}
Do
'Den ersten '1er' von links suchen:}
Z1 = 0
Do
Z1 = Z1 + 1
Loop Until ((Checksumme(Z1) = True) Or (Z1 > 20))
'Ab dieser Stelle mit Maske 1 0 0 0 1 1 1 logisch XOR-verknpfen:}
'Bit mit 1 XOR-verknpfen -> Ergebnis ist das negierte Bit.}
'Bit mit 0 XOR-verknpfen -> Ergebnis ist das Bit.}
If Z1 <= 20 Then
Checksumme(Z1) = Not Checksumme(Z1)
Checksumme(Z1 + 4) = Not Checksumme(Z1 + 4)
Checksumme(Z1 + 5) = Not Checksumme(Z1 + 5)
Checksumme(Z1 + 6) = Not Checksumme(Z1 + 6)
End If
Loop Until Z1 >= 20
'Zeit fr diesen Schritt stoppen:}
Result(0) = Checksumme(26)
Result(1) = Checksumme(25)
Result(2) = Checksumme(24)
Result(3) = Checksumme(23)
Result(4) = Checksumme(22)
Result(5) = Checksumme(21)
Return result
End Function
我被要求将其转换为内部项目。我开始尝试将其转换为python(我的首选语言),所以我可以更好地理解计算:
def getChecksum(identNr, checksumNr=None):
if not 0 <= checksumNr <= 5:
raise ValueError()
checksum = [False] * 27
z1 = 20
doCoZahl = identNr
while doCoZahl > 0:
checksum[z1] = doCoZahl & 1 == 1
z1 -= 1
doCoZahl >>= 2
while z1 > 20:
z1 = 0
while (not checksum[z1]) or z1 <= 20:
z1 += 1
if z1 <= 20:
Checksumme[z1] = not Checksumme[Z1]
Checksumme[z1 + 4] = not Checksumme[Z1 + 4]
Checksumme[z1 + 5] = not Checksumme[Z1 + 5]
Checksumme[z1 + 6] = not Checksumme[Z1 + 6]
return tuple(checksum[-1:-7:-1])
问题是python返回(False, False, False, False, False, False)
,无论我给它什么输入。例如,在VB中:
GetChecksumme | Value (VB)
--------------+-----------
1 | TTTFFF
2 | FTTTFF
某处可能存在一个简单的错误,但我看不到它。
答案 0 :(得分:1)
您永远不会进入最后的while
循环。
z1
从20开始,它(可能)在while doCoZahl > 0:
循环中缩小,因此当您点击while z1 > 20:
z1
时,&lt; = 20。
抱歉,我不懂VB。我可以阅读VB代码,但不足以提供忠实的翻译。