.NET 3.x Значение было недопустимо малым или недопустимо большим для UInt32 - C#
Формулировка задачи:
Добрый день, есть парсер sqllite таблиц, нашел на просторах интернета и возникает такая беда при чтении таблиц, если в таблице есть данные, то всё ок, если их нет вообще, пустая таблица то возникает исключение и ничего не работает. Соответственно читая в цикле 5-10 таблиц и т.д. всё рушиться из-за этой ошибки.
Sqlitehandler.cs
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
Может кто помочь как избавиться от этой ошибки, спасибо заранее.
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; }
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 );
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д