.NET 3.x Значение было недопустимо малым или недопустимо большим для UInt32 - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, есть парсер sqllite таблиц, нашел на просторах интернета и возникает такая беда при чтении таблиц, если в таблице есть данные, то всё ок, если их нет вообще, пустая таблица то возникает исключение и ничего не работает. Соответственно читая в цикле 5-10 таблиц и т.д. всё рушиться из-за этой ошибки. Sqlitehandler.cs
 private bool ReadTableFromOffset(ulong Offset)
        {
           
            if (db_bytes[(int) Offset] == 13)
            {
 
     Вот тут возникает исключение          ushort num2 = Convert.ToUInt16(decimal.Subtract(new decimal(ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3M)), 2)), decimal.One)); // пишет что, вот тут возникает ошибка  Значение было недопустимо малым или недопустимо большим для UInt32
               int length = 0;
                if (table_entries != null)
                {
                    length = table_entries.Length;
                    table_entries =
                        (table_entry[])
                            Utils.CopyArray(table_entries, new table_entry[(table_entries.Length + num2) + 1]);
                }
 
                else
                {
                    table_entries = new table_entry[num2 + 1];
                }
              
                int  num16 = num2;
                for (int i = 0; i <= num16; i++)
                {
                    record_header_field[] _fieldArray = null;
                    ulong num =
                        ConvertToInteger(
                            Convert.ToInt32(decimal.Add(decimal.Add(new decimal(Offset), 8M), new decimal(i*2))), 2);
                    if (decimal.Compare(new decimal(Offset), 100M) != 0)
                    {
                        num += Offset;
                    }
                    int endIndex = GVL((int) num);
                    long num9 = CVL((int) num, endIndex);
                    int num8 =
                        GVL(
                            Convert.ToInt32(
                                decimal.Add(
                                    decimal.Add(new decimal(num),
                                        decimal.Subtract(new decimal(endIndex), new decimal(num))), decimal.One)));
                    table_entries[length + i].row_id =
                        CVL(
                            Convert.ToInt32(
                                decimal.Add(
                                    decimal.Add(new decimal(num),
                                        decimal.Subtract(new decimal(endIndex), new decimal(num))), decimal.One)), num8);
                    num =
                        Convert.ToUInt64(
                            decimal.Add(
                                decimal.Add(new decimal(num), decimal.Subtract(new decimal(num8), new decimal(num))),
                                decimal.One));
                    endIndex = GVL((int) num);
                    num8 = endIndex;
                    long num7 = CVL((int) num, endIndex);
                    long num10 =
                        Convert.ToInt64(decimal.Add(decimal.Subtract(new decimal(num), new decimal(endIndex)),
                            decimal.One));
                    for (int j = 0; num10 < num7; j++)
                    {
                        _fieldArray =
                            (record_header_field[]) Utils.CopyArray(_fieldArray, new record_header_field[j + 1]);
                        endIndex = num8 + 1;
                        num8 = GVL(endIndex);
                        _fieldArray[j].type = CVL(endIndex, num8);
                        if (_fieldArray[j].type > 9L)
                        {
                            if (IsOdd(_fieldArray[j].type))
                            {
                                _fieldArray[j].size = (long) Math.Round((_fieldArray[j].type - 13L)/2.0);
                            }
                            else
                            {
                                _fieldArray[j].size = (long) Math.Round((_fieldArray[j].type - 12L)/2.0);
                            }
                        }
                        else
                        {
                            _fieldArray[j].size = SQLDataTypeSize[(int) _fieldArray[j].type];
                        }
                        num10 = (num10 + (num8 - endIndex)) + 1L;
                    }
                    if (_fieldArray != null)
                    {
                        table_entries[length + i].content = new string[(_fieldArray.Length - 1) + 1];
                        int num4 = 0;
                        int num17 = _fieldArray.Length - 1;
                        for (int k = 0; k <= num17; k++)
                        {
                            if (_fieldArray[k].type > 9L)
                            {
                                if (!IsOdd(_fieldArray[k].type))
                                {
                                    if (decimal.Compare(new decimal(encoding), decimal.One) == 0)
                                    {
                                        table_entries[length + i].content[k] = Encoding.Default.GetString(db_bytes,
                                            Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num), new decimal(num7)),
                                                new decimal(num4))), (int) _fieldArray[k].size);
                                    }
                                    else if (decimal.Compare(new decimal(encoding), 2M) == 0)
                                    {
                                        table_entries[length + i].content[k] = Encoding.Unicode.GetString(db_bytes,
                                            Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num), new decimal(num7)),
                                                new decimal(num4))), (int) _fieldArray[k].size);
                                    }
                                    else if (decimal.Compare(new decimal(encoding), 3M) == 0)
                                    {
                                        table_entries[length + i].content[k] = Encoding.BigEndianUnicode.GetString(
                                            db_bytes,
                                            Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num), new decimal(num7)),
                                                new decimal(num4))), (int) _fieldArray[k].size);
                                    }
                                }
                                else
                                {
                                    table_entries[length + i].content[k] = Encoding.Default.GetString(db_bytes,
                                        Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num), new decimal(num7)),
                                            new decimal(num4))), (int) _fieldArray[k].size);
                                }
                            }
                            else
                            {
                                table_entries[length + i].content[k] =
                                    Conversions.ToString(
                                        ConvertToInteger(
                                            Convert.ToInt32(decimal.Add(decimal.Add(new decimal(num), new decimal(num7)),
                                                new decimal(num4))), (int) _fieldArray[k].size));
                            }
                            num4 += (int) _fieldArray[k].size;
                        }
                    }
                }
            }
            else if (db_bytes[(int) Offset] == 5)
            {
                ushort num14 =
                    Convert.ToUInt16(
                        decimal.Subtract(
                            new decimal(ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3M)), 2)),
                            decimal.One));
                int num18 = num14;
                for (int m = 0; m <= num18; m++)
                {
                    ushort num13 =
                        (ushort)
                            ConvertToInteger(
                                Convert.ToInt32(decimal.Add(decimal.Add(new decimal(Offset), 12M), new decimal(m*2))), 2);
                    ReadTableFromOffset(
                        Convert.ToUInt64(
                            decimal.Multiply(
                                decimal.Subtract(new decimal(ConvertToInteger((int) (Offset + num13), 4)), decimal.One),
                                new decimal(page_size))));
                }
                ReadTableFromOffset(
                    Convert.ToUInt64(
                        decimal.Multiply(
                            decimal.Subtract(
                                new decimal(ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 8M)), 4)),
                                decimal.One), new decimal(page_size))));
            }
            return true;
        }
System.Collections.ListDictionaryInternal в System.Decimal.ToUInt32(Decimal d) в System.Decimal.ToUInt16(Decimal value) в System.Decimal.op_Explicit(Decimal value) в ConsoleApplication2.SQLiteHandler.ReadTableFromOffset(UInt64 Offset) в c:\Users\westc_000\Documents\Visual Studio 2013\Projects\WpfApplication8\WpfApplication8\SQLiteHandler.cs:строка 440 в ConsoleApplication2.SQLiteHandler.ReadTable(String TableName) в c:\Users\westc_000\Documents\Visual Studio 2013\Projects\WpfApplication8\WpfApplication8\SQLiteHandler.cs:строка 431 в Steamfake_2.Cookies.Chrome_based_.ChromeCookies.Cookies(String output) в c:\Users\westc_000\Documents\Visual Studio 2013\Projects\WpfApplication8\WpfApplication8\Cookies\Chrome(based)\ChromeCookies.cs:строка 50 в WpfApplication8.MainWindow..ctor() в c:\Users\westc_000\Documents\Visual Studio 2013\Projects\WpfApplication8\WpfApplication8\MainWindow.xaml.cs:строка 38Значение было недопустимо малым или недопустимо большим для UInt32.mscorlib
 ushort num2 = Convert.ToUInt16(decimal.Subtract(new decimal(ConvertToInteger(Convert.ToInt32(decimal.Add(new decimal(Offset), 3M)), 2)), decimal.One));   // Пишет что тут возникает ошибка overflowexception
Может кто помочь как избавиться от этой ошибки, спасибо заранее.

Решение задачи: «.NET 3.x Значение было недопустимо малым или недопустимо большим для UInt32»

textual
Листинг программы
table_entries[length + i].content[k] = Encoding.Default.GetString(
    db_bytes,
    (int)(num + (ulong)num7 + (ulong)num4),
    (int)_fieldArray[k].size
);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы