将VB代码翻译成Python

时间:2016-04-18 15:01:38

标签: python vb.net translate

我有以下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

某处可能存在一个简单的错误,但我看不到它。

1 个答案:

答案 0 :(得分:1)

您永远不会进入最后的while循环。

z1从20开始,它(可能)在while doCoZahl > 0:循环中缩小,因此当您点击while z1 > 20: z1时,&lt; = 20。

抱歉,我不懂VB。我可以阅读VB代码,但不足以提供忠实的翻译。