diff --git a/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj b/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj index a61c6e2..2663434 100644 --- a/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj +++ b/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj @@ -46,7 +46,7 @@ False - ..\..\VIN-LIB\VIN-LIB\bin\Debug\VIN-LIB.dll + ..\..\VIN-LIB\VIN-LIB\bin\Release\VIN-LIB.dll diff --git a/ConsoleApp1/ConsoleApp1/Program.cs b/ConsoleApp1/ConsoleApp1/Program.cs index ff3382b..3618d35 100644 --- a/ConsoleApp1/ConsoleApp1/Program.cs +++ b/ConsoleApp1/ConsoleApp1/Program.cs @@ -14,35 +14,34 @@ namespace ConsoleApp1 { string[] testVins = new string[] { - // РОССИЯ (XTA - АвтоВАЗ, X7L - Renault) - "XTA210700L1234567", "XTA211400M1234567", "X7LHSR450J1234567", "XTA11183091234567", "XTA210900V1234567", + // --- ЕВРОПА --- + "WBA12345601123456", "WDCABCDEF11123456", "VF3CC8HZB81234567", "ZFA18200001234567", "TMBABCDEF51123456", // Германия, Франция, Италия, Чехия + "SAL12345678123456", "YS312345678123456", "VSS12345678123456", "UU1ABCDEF01123456", "Y312345678123456", // Британия, Швеция, Испания, Румыния, Беларусь - // ГЕРМАНИЯ (WBA - BMW, WVG - VW, WDC - Mercedes) - "WBA316000K1234567", "WVWZZZ1JZ1W123456", "WDC1690311J123456", "WBA530D00L1234567", "WVGZZZ5NZCW123456", + // --- РОССИЯ И СНГ --- + "X3912345678123456", "XTA210700L1234567", "Z6123456731234567", "XWB12345678123456", "XW812345678123456", // АвтоВАЗ, КамАЗ, Узбекистан - // США (1FA - Ford, 1GC - Chevrolet) - "1FA6P8CF0E1234567", "1G6AF57V041234567", "1FMEU34E071234567", "1GCGK23G0B1234567", "1FM5K8GT0H1234567", + // --- СЕВЕРНАЯ АМЕРИКА --- + "1FA6P8CF0E1234567", "1G6AF57V041234567", "2FT12345678123456", "3HG12345678123456", "1FM5K8GT0H1234567", // США, Канада, Мексика - // ЯПОНИЯ (JTD - Toyota, JHM - Honda) - "JTD12345678123456", "JHMRE485081234567", "JTDKB22U001234567", "JHMCV1650C1234567", "JTDGX31P0E1234567", + // --- АЗИЯ --- + "JTD12345678123456", "JHMRE485081234567", "KNAJP241261234567", "KMHCT41M0A1234567", "LSV12345678123456", // Япония, Корея, Китай + "ML12345678123456", "PL12345678123456", "NL12345678123456", "RA12345678123456", "MA12345678123456", // Таиланд, Малайзия, Турция, ОАЭ, Индия - // ЮЖНАЯ КОРЕЯ (KNA - Kia, KMH - Hyundai) - "KNAJP241261234567", "KMHCT41M0A1234567", "KNAKU4120D1234567", "KMHSH51J0B1234567", "KNAJX5240L1234567", + // --- ЮЖНАЯ АМЕРИКА --- + "9312345678123456", "8AW12345678123456", "9BW12345678123456", "8L12345678123456", "9S12345678123456", // Бразилия, Аргентина, Эквадор, Уругвай - // МАЛЫЕ ПРОИЗВОДИТЕЛИ (3-й символ '9') - // Здесь страна определяется по 12-14 символам (в примерах это X39 - Россия) - "X3912345678X39456", "W0912345678W09123", "Y9912345678Y99123", "Z9912345678Z99123", "99912345678999123", + // --- АФРИКА --- + "AA123456781234567", "DA12345678123456", "FA12345678123456", "BA12345678123456", "CL12345678123456", // ЮАР, Египет, Гана, Ангола, Тунис - // ФРАНЦИЯ И ИТАЛИЯ (VF3 - Peugeot, ZFA - Fiat) - "VF3CC8HZB81234567", "ZFA18200001234567", "VF7LC5FW091234567", "ZAR93900001234567", "VF32CKFVC21234567", + // --- ОКЕАНИЯ --- + "6A12345678123456", "7A12345678123456", "6F12345678123456", "7E12345678123456", "6G12345678123456", // Австралия, Новая Зеландия - // РАЗНЫЕ РЕГИОНЫ (Китай, Великобритания, Швеция) - "LSV12345678123456", "SAL12345678123456", "YS312345678123456", "LNV12345678123456", "SAB12345678123456", - - // ДОПОЛНИТЕЛЬНЫЕ (Казахстан, Узбекистан, Чехия) - "KS112345678123456", "XWB12345678123456", "TMB12345678123456", "KZC12345678123456", "XW812345678123456", - "3HG12345678123456", "8AW12345678123456", "Z1B12345678123456", "Z5S12345678123456", "VF112345678123456" + // --- РЕДКИЕ / КАЗАХСТАН --- + "KS112345678123456", "KZC12345678123456", "Z1B12345678123456", "Z5S12345678123456", "X7L12345678123456" // Казахстан, Литва, Renault (РФ) + }; + string[] testMarks = { // 1. Последовательная серия (проверка инкремента цифр) @@ -70,7 +69,7 @@ namespace ConsoleApp1 "A025AA29", "B026BB30", "E027EE31", "K028KK32", "M029MM33", "H030HH34", "O031OO35", "P032PP36", "C033CC37", "T034TT38", "Y035YY39", "X036XX40", "A037AA41", "B038BB42", "E039EE43", "K040KK44", "M041MM45", "H042HH46", "O043OO47", "P044PP48", "C045CC49", "T046TT50", "Y047YY51", "X048XX52", - "A100AA177", "B200BB197", "E300EE199", "K400KK777" + "A100AA177", "B200BB197", "E300EE199", "M999MP159" }; /* int i = 0; @@ -83,13 +82,14 @@ namespace ConsoleApp1 j++; Console.WriteLine($"Страна: {VIN_LIB.VIN.GetVINCountry(v)}"); Console.WriteLine($"Вин номер: {(VIN_LIB.VIN.CheckVIN(v) ? "Верный" : "Не верный")}"); + Console.WriteLine($"{v}"); Console.WriteLine($"Год: {VIN_LIB.VIN.GetTransportYear(v)}"); } Console.WriteLine($"Успешно: {i}"); Console.WriteLine($"Не успешно: {j}"); - Console.ReadLine(); - */ - + Console.ReadLine();*/ + + int i = 0; int j = 0; foreach (string v in testMarks) @@ -110,6 +110,7 @@ namespace ConsoleApp1 Console.WriteLine($"Номер ТС: Верный"); Console.WriteLine($"Текущая марка: {v} \t Следующая марка: {nextMark}"); Console.WriteLine($"Интервал до {rangeEnd}: {nextInRange}"); + Console.WriteLine($"Возможное кол-во {REG_MARK_LIB.REG_MARK.GetCombinationsCountInRange(v,rangeEnd)}"); } else { diff --git a/VIN-LIB/VIN-LIB.sln b/VIN-LIB/VIN-LIB.sln index c2fe958..398e4bf 100644 --- a/VIN-LIB/VIN-LIB.sln +++ b/VIN-LIB/VIN-LIB.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.13.35919.96 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VIN-LIB", "VIN-LIB\VIN-LIB.csproj", "{78203663-3306-4E81-922F-1A5A939A22BC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{714254CA-DDE4-42B2-8077-38D9F565C70F}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -17,10 +15,6 @@ Global {78203663-3306-4E81-922F-1A5A939A22BC}.Debug|Any CPU.Build.0 = Debug|Any CPU {78203663-3306-4E81-922F-1A5A939A22BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {78203663-3306-4E81-922F-1A5A939A22BC}.Release|Any CPU.Build.0 = Release|Any CPU - {714254CA-DDE4-42B2-8077-38D9F565C70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {714254CA-DDE4-42B2-8077-38D9F565C70F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {714254CA-DDE4-42B2-8077-38D9F565C70F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {714254CA-DDE4-42B2-8077-38D9F565C70F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/VIN-LIB/VIN-LIB/VIN.cs b/VIN-LIB/VIN-LIB/VIN.cs index e051726..7bd76ce 100644 --- a/VIN-LIB/VIN-LIB/VIN.cs +++ b/VIN-LIB/VIN-LIB/VIN.cs @@ -178,6 +178,9 @@ namespace VIN_LIB return true; return false; } + + + public static char CalculateCheckDigit(string vin) { int GetValue(char c) @@ -225,21 +228,17 @@ namespace VIN_LIB if (string.IsNullOrEmpty(vin) || vin.Length < 10) return 0; - // Год — это всегда 10-й символ VIN (индекс 9) + char yearCode = char.ToUpper(vin[9]); if (YearCodes.TryGetValue(yearCode, out int baseYear)) { - // Поскольку коды повторяются каждые 30 лет (A было в 1980 и снова в 2010), - // нужно определить, к какому периоду относится авто. - // Современные системы обычно проверяют текущий год. - + int currentYear = DateTime.Now.Year; int year = baseYear; - // Если машина из будущего (например, код 'A' и сейчас 2024 год), - // значит это 2010 год, а не 1980. - while (year + 30 <= currentYear + 1) // +1, так как модельный год может обгонять календарный + + while (year + 30 <= currentYear + 1) { year += 30; } @@ -249,7 +248,7 @@ namespace VIN_LIB return 0; } - public static bool CheckVIS(string vin) + /*public static bool CheckVIS(string vin) { if (string.IsNullOrEmpty(vin) || vin.Length < 17) return false; @@ -271,6 +270,51 @@ namespace VIN_LIB if (!CheckVIS(vin)) return false; return true; + }*/ + + public static bool CheckVIN(string vin) + { + if (string.IsNullOrEmpty(vin) || vin.Length != 17) + return false; + + + string upperVin = vin.ToUpper(); + if (upperVin.Contains("I") || upperVin.Contains("O") || upperVin.Contains("Q")) + return false; + + + if (!CheckWMI(upperVin)) + return false; + + char zone = upperVin[0]; + bool isNorthAmericaOrChina = "12345L".Contains(zone); + + if (isNorthAmericaOrChina) + { + if (!CheckVDS(upperVin)) return false; + } + + if (!CheckVIS(upperVin)) + return false; + + return true; + } + + + public static bool CheckVIS(string vin) + { + + for (int i = 13; i < 17; i++) + { + if (!char.IsDigit(vin[i])) return false; + } + + + char yearChar = vin[9]; + if (yearChar == 'U' || yearChar == 'Z' || yearChar == '0') + return false; + + return true; } } }