【问题标题】:Converting VB6 code snippet to VB.NET将 VB6 代码片段转换为 VB.NET
【发布时间】:2012-02-09 21:57:33
【问题描述】:

我很难将此 sn-p 转换为 VB.NET

Function DecryptPassword(ByVal s As String) As String
    Dim i As Integer
    Dim sPass As String = s.Trim()

    For i = 1 To Len(sPass)
        If Asc(Mid$(sPass, i, 1)) - 5 < 124 Then

            'this line throws "type char $ does not match declared data type char"
            Mid$(sPass, i, 1) = Chr$(Asc(Mid$(sPass, i, 1)) - 5) 

        Else
            Mid$(sPass, i, 1) = Mid$(sPass, i, 1)
        End If
    Next
    DecryptPassword = UCase(sPass)  ' Convert UserPassword to UpperCase
End Function

它在 VB6 中运行良好,但在我使用 VB.Net 时抛出错误。

【问题讨论】:

  • 您尝试过 Visual Studio 的升级向导吗?
  • 你试过没有非$版本的mid吗?
  • @hydroparadise - 升级向导在 VS2010 以后不可用,因此取决于 OP 的版本
  • 很高兴知道。我确实有 VB.NET 2010 Express,并注意到它没有。只是以为它不包含在 Express 版本中。
  • 据我所知,vb2008 是最后一个包含升级向导的。我想这个的快递版还是可以下载的。不过,我认为您必须花点时间才能注册它。

标签: vb.net vb6


【解决方案1】:

试试这个版本:

Function DecryptPassword(ByVal s As String) As String

    If String.IsNullOrEmpty(s) Then
        Return String.Empty
    End If

    Dim sbPass As New System.Text.StringBuilder(s.Length)

    For Each oCharacter As Char In s.Trim
        If Asc(oCharacter) - 5 < 124 Then
            sbPass.Append(Convert.ToChar(Asc(oCharacter) - 5))
        Else
            sbPass.Append(oCharacter)
        End If
    Next
    Return sbPass.ToString.ToUpper
End Function

【讨论】:

  • @OlivierJacot-Descombes 好吧,它有 ReturnFor EachStringBuilder,但它在运行时失败,因为字符串生成器是空的。构造函数中设置的容量与存储的文本长度不同,即0。应该使用sbPass.Append 而不是索引器。
  • 好点!使用s.Length 创建StringBuilder 并同时使用Append() 是可行的方法。
  • 好消息 GSerg:代码被反复重写以达到这一点,我忘记在最终版本中包含附加。我已经修复了答案并包含了对 s isnullorempty 的初始检查,这样我们在初始化 stringbuilder 时就不会遇到异常。
  • @competent_tech 需要再进行一次迭代。 sbPass.Append(wIndex) = oCharacter => sbPass.Append(oCharacter)。同上。
  • 美白肉汁。我真的应该更多地关注我有时正在做的事情。这已得到修复。再次感谢。
【解决方案2】:

这似乎有效(只是像 Booji Boy 写的那样删除了“$”)。

Function DecryptPassword(ByVal s As String) As String
    Dim i As Integer
    Dim sPass As String = s.Trim()

    For i = 1 To Len(sPass)
        If Asc(Mid(sPass, i, 1)) - 5 < 124 Then
            Mid(sPass, i, 1) = Chr(Asc(Mid(sPass, i, 1)) - 5)
        Else
            Mid(sPass, i, 1) = Mid(sPass, i, 1)
        End If
    Next
    DecryptPassword = UCase(sPass)  ' Convert UserPassword to UpperCase 
End Function

【讨论】:

    【解决方案3】:

    为了它,一个 linq 方法。

    Function DecryptPassword(ByVal s As String) As String
        Return s.Aggregate(Of String)(String.Empty, Function(acc, c) acc & Char.ToUpper(If(Asc(c) - 5 < 124, Convert.ToChar(Asc(c) - 5), c)))
    End Function
    

    或者

    Function DecryptPassword(ByVal s As String) As String
        Return New String((From c In s Select Char.ToUpper(If(Asc(c) - 5 < 124, Convert.ToChar(Asc(c) - 5), c))).ToArray)
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多