У меня есть следующий код в C, который будет генерировать ключи на основе входного серийного номера.Побитовое дополнение символа в C# vs C overflowexception
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]));
этой линии.
Другого заметное поведения является то, что, например, у меня есть вклад в
Затем на этой линии snstring[i] = Convert.ToChar(~Convert.ToInt32(snstring[i + 1]));
значения snstring[i+1]
является '\u0005'
И бросает OverflowException было Неизвестное.
Я не уверен, что я должен делать, любая помощь приветствуется.
Результат '~ Convert.ToInt32 (snstring [+ 1])' не могут быть преобразованы в уголь, как это выходит за пределы диапазона. Смирись с этим. –
Остановить преобразование между 'int' и' char'. Преобразуйте в 'int' один раз, примените все биты, а затем конвертируйте обратно. – Phylogenesis
Почему бы не использовать хорошую старую функцию c? См .: http://stackoverflow.com/a/11593657/3989673 – bigahega