VB6 代码 VB.NET

VB6 Code to VB.NET

我在将 VB6 翻译成 VB.NET 时遇到问题,我需要将其翻译为新功能。

我尝试将 VB6 代码翻译成 VB.net 但失败了也许有人可以帮我解决这个问题

我不知道 ReDim intKeyChars(1 To intKeyLen) 应该是什么样子,其余的我认为可以复制粘贴到 VB.NET。在某些情况下,VB6 的行为不同于 VB.NET。

  Public Function EnDecrypt( _
  ByVal strInputText As String, _
  ByRef strOutputText As String _
  ) As Boolean

On Error Resume Next
  On Error GoTo ErrorHandler

  ' Private vars
  Dim intKeyChars()   As Long
  Dim intKeyChr       As Long
  Dim intKeyIndex     As Long
  Dim intKeyLen       As Long
  Dim intTextLen      As Long
  Dim intCounter      As Long
  Dim strInputKey     As String

  ' Set input key
  strInputKey = "TEST1290"

  ' Move key chars into an array of long to speed up code
  intTextLen = Len(strInputText)
  intKeyLen = Len(strInputKey)
  intKeyIndex = intKeyLen

  If (intKeyLen = 0) Or (intTextLen = 0) Then
    GoTo ErrorHandler
  End If

  ReDim intKeyChars(1 To intKeyLen)

  For intCounter = 1 To intKeyLen
    intKeyChars(intCounter) = Asc(Mid(strInputKey, intCounter, 1))
  Next intCounter

  For intCounter = 1 To intTextLen

    ' Get the next char in the password
    intKeyChr = intKeyChars(intKeyIndex)

    ' EnDecrypt one character in the string
    Mid(strInputText, intCounter, 1) = Chr(Asc(Mid(strInputText, intCounter, 1)) Xor intKeyChr)

    ' Modify the character in the password (avoid overflow)
    intKeyChars(intKeyIndex) = (intKeyChr + 32) Mod 126

    ' Prepare to use next char in the password
    intKeyIndex = (intKeyIndex Mod intKeyLen) + 1

  Next intCounter

  ' Return values
  strOutputText = strInputText
  EnDecrypt = True

  Exit Function

ErrorHandler:

  ' Return values
  strOutputText = vbNullString
  EnDecrypt = False

End Function

让我们逐步了解代码的实际作用:

ReDim intKeyChars(1 To intKeyLen)

ReDim 关键字从字面上重新声明 intKeyChars 变量,其中 1 到 intKeyLen 指定您想要数组的底部从 1 的索引开始(这在遗留 VB 代码中很常见)和数组的顶部以 intKeyLen 的任何值的索引结束。

您需要进行一些调整。首先,在 Visual Basic .NET 中,数组的索引不能为 1,它们的索引必须为 0。

其次,遗留 VB 代码使用 ReDim 语句向数组添加项的原因是因为没有简单的方法向集合添加或删除项,您实际上必须重新分配内存并在那时添加或删除任何值。幸运的是,在 Visual Basic .NET 中,我们有 List(Of T) collection,它为我们提供了内置方法,例如 Add、AddRange、Insert、Remove、RemoveAt 和 RemoveRange。但是在进一步查看代码之后,原始遗留代码应该首先声明指定上限等于字符串长度的数组(不需要每次都重新调整数组)。

因此,在您的情况下,更新后的代码可能如下所示:

Dim intKeyChars(strInputKey.Length - 1) As Integer
For intCounter As Integer = 0 To intKeyChars.Length - 1
    intKeyChars(intCounter) = Asc(strInputKey(intCounter))
Next

ReDim 语句可以如下所示: ReDim intKeyChars(intKeyLen)

VB.NET 数组总是下界为零,因此 ReDim 只接受一个参数,即上界。请注意,与 C# 不同,上限索引将是 UBound(intKeyChars),而不是 UBound(intKeyChars)-1,因此其余代码应该可以工作。 (intKeyChars 元素零将不被使用。)