C#中字符的逐位补码与C溢出异常
本文关键字:溢出 异常 补码 字符 | 更新日期: 2023-09-27 18:02:32
我在C中有以下代码,它将根据输入的序列号生成密钥。
unsigned int32 passkey(unsigned int32 snumber)
{
char snstring[11];
unsigned int32 pwd;
int i = 0;
itoa(snumber,10,snstring);
do{
snstring[i+1] -= '0';
snstring[i] = ~snstring[i+1];
snstring[i] &= 0x07;
i++;
}while(i < 9);
snstring[9] <<= 1;
snstring[9] &= 0x07;
pwd = atoi32(snstring);
return (pwd);
}
我需要将此转换为C#代码,我尝试了以下操作:
private uint ComputeKey(uint snumber)
{
char[] snstring = new char[11];
UInt32 pwd;
int i = 0;
snstring = snumber.ToString().ToCharArray();
do
{
snstring[i + 1] = Convert.ToChar(snstring[i + 1] - '0');
snstring[i] = Convert.ToChar(~Convert.ToInt32(snstring[i + 1]));
snstring[i] &= Convert.ToChar(Convert.ToInt32(0x07));
i++;
} while (i < 9);
snstring[9] <<= 1;
snstring[9] &= Convert.ToChar(0x07);
pwd = Convert.ToUInt32(snstring);
return (pwd);
}
程序在此行的snstring[i] = Convert.ToChar(~Convert.ToInt32(snstring[i + 1]));
处抛出异常。
另一个值得注意的行为是,例如,我将输入作为
151972634
那么,在这一行上,snstring[i+1]
的snstring[i] = Convert.ToChar(~Convert.ToInt32(snstring[i + 1]));
值为''u0005'
它抛出OverflowException是Unhandled。
我不知道我应该做什么,任何帮助都很感激。
我也做过类似的任务,即将数字作为输入,并完全按照代码在C#中所做的操作。我将字符串作为输入并返回字符串。以下是代码:
private string ComputeKey(string serialnumber)
{
if (string.IsNullOrEmpty(serialnumber))
{
throw new Exception("Cannot generate a key from a null or empty string");
}
serialnumber += ''0';
var length = serialnumber.Length;
byte[] snbytes = Encoding.UTF8.GetBytes(serialnumber);
for (int i = 0; i < length - 1; i++)
{
snbytes[i + 1] -= 0x30;
snbytes[i] = (byte)~snbytes[i + 1];
snbytes[i] &= 0x07;
}
snbytes[length - 1] <<= 1;
snbytes[length - 1] &= 0x07;
var sb = new StringBuilder();
for (int j = 0; j < length - 1; j++)
{
sb.Append(snbytes[j].ToString());
}
return sb.ToString();
}
当您翻转表示char
的32位int
的位时,它在C中总是有一个字节,您最终会将上面的三个字节设置为0xFF
。然而,C很高兴地在分配给char
时切掉了上面的字节,而C#的转换器抛出了一个异常。
您可以通过使用强制转换来解决这个问题,以匹配C所做的:
snstring[i+1] -= '0';
snstring[i] = (char)(~snstring[i+1] & 0x07);
从本质上讲,强制转换告诉C#做与默认情况下C做的相同的事情。