我得到以下错误:
算术运算导致溢出
在下面的代码上:
Public Function DoEncode(ByVal aPassword As String, ByVal aPassword2 As String) As String
Dim ascii As New ASCIIEncoding()
Dim b As Byte() = ascii.GetBytes(aPassword)
Dim b2 As Byte() = ascii.GetBytes(aPassword2)
Dim iDiff As UInt32 = b2(0) - b(0)
For i As Integer = 0 To b.Length - 1
b(i) += CByte(iDiff)
Next
Return ascii.GetString(b)
End Function
我使用了登录表单中的功能:
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
If UsernameTextBox.Text.Trim() = "" Then
MessageBox.Show("Please enter your user id", "User ID", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
Return
End If
If PasswordTextBox.Text.Trim() = "" Then
MessageBox.Show("Please enter your password", "User ID", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
Return
End If
If O.AppMan.DoLogin(UsernameTextBox.Text, PasswordTextBox.Text) Then
DialogResult = System.Windows.Forms.DialogResult.OK
End If
End Sub
上部代码用于:
Public Class TApplicationManager
Public Class O
Public Shared AppMan As New TApplicationManager()
End Class
Public Function DoEncode(ByVal aPassword As String, ByVal aPassword2 As String) As String
Dim ascii As New ASCIIEncoding()
Dim b As Byte() = ascii.GetBytes(aPassword)
Dim b2 As Byte() = ascii.GetBytes(aPassword2)
Dim iDiff As UInt32 = b2(0) - b(0)
For i As Integer = 0 To b.Length - 1
b(i) += CByte(iDiff)
Next
Return ascii.GetString(b)
End Function
Public Function DoLogin(ByVal strUser As String, ByVal strPwd As String) As Boolean
Dim dtbUser As New DataTable()
Dim dtbUserCare As New DataTable()
Dim UserName As String
Dim UserPass As String
Dim cnn As New MySqlConnection(My.Settings.sys_dbConnectionString)
Dim strLoginCare As String = "SELECT * FROM tblusers where Username = '" + strUser + "'"
Dim daUser As New MySqlDataAdapter(strLoginCare, cnn)
dtbUser.Clear()
daUser.Fill(dtbUser)
If dtbUser.Rows.Count = 0 Then
MessageBox.Show("User does not exist", "User status", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
Return False
End If
Dim drwUser As DataRow = dtbUser.Rows(0)
UserPass = drwUser("Password").ToString()
UserName = drwUser("Username").ToString()
Dim daUserCare As New MySqlDataAdapter(strLoginCare, cnn)
dtbUserCare.Clear()
daUserCare.Fill(dtbUserCare)
If dtbUserCare.Rows.Count = 0 Then
MessageBox.Show("Invalid user id", "User status", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
Return False
End If
Dim drwUserCare As DataRow = dtbUserCare.Rows(0)
If drwUserCare("Password").ToString() <> DoEncode(strPwd, drwUserCare("Password").ToString()) Then
MessageBox.Show("Invalid password. Please try again", "User status", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
Return False
End If
If drwUserCare("status").ToString() <> "Y" Then
MessageBox.Show("User is not active", "User status", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
Return False
End If
UserPass = drwUserCare("Password").ToString()
UserName = drwUserCare("Username").ToString()
Return True
End Function
End Class
为什么我会出现此错误?
好吧,我要尝试一下,它是:
Dim iDiff As UInt32 = b2(0) - b(0)
For i As Integer = 0 To b.Length - 1
b(i) += CByte(iDiff)
Next
A) Uint32不能为负数,并且您正在执行两个字节之间的减法运算。
B) 然后,您将减去的值强制转换为Byte-字节不能为负,如果您尝试这样做,内存将抛出此异常
我真的不明白你在上面的循环中想做什么。
编辑
根据你对这段代码在c#中工作而不是在VB中工作的评论,我的答案仍然适用。由于负数或大于255,转换失败。
c不会像VB那样自动检查溢出错误。
您可以禁用这种行为,尽管在我看来,将代码更改为不溢出会更好。你可能会得到意想不到的结果。
请参阅:https://msdn.microsoft.com/en-us/library/aa716336(v=vs.60).aspx
您可以通过以下方式禁用它:
项目属性,启用配置属性=>优化=>删除整数溢出检查。
通过将转换/计算封装在"checked"块中,可以在c#中实现相同的行为。