System.OverflowException и как это исправить - PullRequest
0 голосов
/ 06 апреля 2020

Я делал поддельную программу шифрования и при попытке преобразовать строку в int32, и я получаю следующее сообщение System.OverflowException. Сообщение об ошибке находится в Convert.ToInt32 (textnumbers);

 static void encryption(string text)
    {
        byte[] nums = Encoding.ASCII.GetBytes(text);
        int[] en = new int[nums.Length];

        for (int i = 0; i < nums.Length; i++)
        {

            en[i] = nums[i] * 2 + 5;

        }

        string textnumbers = string.Join("", en);
        Console.WriteLine(textnumbers);

        int num = Convert.ToInt32(textnumbers);

        string hexValue = num.ToString("x");
        Console.WriteLine(hexValue);

    }
    static void Main(string[] args)
    {

        encryption("abcde");
        Console.ReadLine();

    }

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Важно обратить внимание на сообщение об исключении, которое генерирует System.OverflowException, а именно:

Значение было слишком большим или слишком маленьким для Int32.

Это дает вам большой ключ к пониманию проблемы.

Далее, если вы посмотрите на значение textnumbers после завершения for l oop, вы увидите, что его значение равно 199201203205207. Как упоминалось в Çöđěxěŕ, максимальное значение, которое может хранить 32-разрядное целое число со знаком, составляет 2147483647, поэтому исключение говорит о том, что 32-разрядное целое число недостаточно велико для сохранения нужного значения.

Чтобы исправить это, вы можете использовать 64-разрядное целое число:

long num = Convert.ToInt64(textnumbers);

long представляет 64-разрядное целое число со знаком и может хранить значения в диапазоне от -9223372036854775808 до 9223372036854775807, включительно, в котором можно удобно хранить 199201203205207.

Если вам когда-нибудь понадобится узнать диапазон значений, которые может представлять тип цифр c, вы можете проверить его MinValue и MaxValue свойства (например, int.MinValue, или long.MaxValue).

Одно: вы должны научиться работать с отладчиком, потому что это устраняет проблемы такого рода самостоятельно. Это время стоит потратить, чтобы вы могли самостоятельно решать такие проблемы, не полагаясь на других.

0 голосов
/ 06 апреля 2020

Ваша программа генерирует «199201203205207», что больше, чем вы могли бы уместить в int. попробуйте изменить его на long, также используйте Convert.ToInt64(textnumbers):

static void encryption(string text)
{
    byte[] nums = Encoding.ASCII.GetBytes(text);
    int[] en = new int[nums.Length];

    for (int i = 0; i < nums.Length; i++)
    {

        en[i] = nums[i] * 2 + 5;

    }

    string textnumbers = string.Join("", en);
    Console.WriteLine(textnumbers);

    long num = Convert.ToInt64(textnumbers);

    string hexValue = num.ToString("x");
    Console.WriteLine(hexValue);

}

static void Main(string[] args)
{

    encryption("abcde");
    Console.ReadLine();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...