入力シリアル番号に基づいてキーを生成する 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
次に、この行でissnstring[i] = Convert.ToChar(~Convert.ToInt32(snstring[i + 1]));
の値が
スローされ、OverflowException was Unhandled がスローされます。snstring[i+1]
'\u0005'
何をすべきかわかりません。助けていただければ幸いです。