Fifth push

This commit is contained in:
2026-03-31 11:19:18 +05:00
parent cd46c83af4
commit 0a6acc6bce
4 changed files with 80 additions and 41 deletions

View File

@@ -46,7 +46,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="VIN-LIB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="VIN-LIB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\VIN-LIB\VIN-LIB\bin\Debug\VIN-LIB.dll</HintPath> <HintPath>..\..\VIN-LIB\VIN-LIB\bin\Release\VIN-LIB.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -14,35 +14,34 @@ namespace ConsoleApp1
{ {
string[] testVins = new string[] 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 - Россия) "AA123456781234567", "DA12345678123456", "FA12345678123456", "BA12345678123456", "CL12345678123456", // ЮАР, Египет, Гана, Ангола, Тунис
"X3912345678X39456", "W0912345678W09123", "Y9912345678Y99123", "Z9912345678Z99123", "99912345678999123",
// ФРАНЦИЯ И ИТАЛИЯ (VF3 - Peugeot, ZFA - Fiat) // --- ОКЕАНИЯ ---
"VF3CC8HZB81234567", "ZFA18200001234567", "VF7LC5FW091234567", "ZAR93900001234567", "VF32CKFVC21234567", "6A12345678123456", "7A12345678123456", "6F12345678123456", "7E12345678123456", "6G12345678123456", // Австралия, Новая Зеландия
// РАЗНЫЕ РЕГИОНЫ (Китай, Великобритания, Швеция) // --- РЕДКИЕ / КАЗАХСТАН ---
"LSV12345678123456", "SAL12345678123456", "YS312345678123456", "LNV12345678123456", "SAB12345678123456", "KS112345678123456", "KZC12345678123456", "Z1B12345678123456", "Z5S12345678123456", "X7L12345678123456" // Казахстан, Литва, Renault (РФ)
// ДОПОЛНИТЕЛЬНЫЕ (Казахстан, Узбекистан, Чехия)
"KS112345678123456", "XWB12345678123456", "TMB12345678123456", "KZC12345678123456", "XW812345678123456",
"3HG12345678123456", "8AW12345678123456", "Z1B12345678123456", "Z5S12345678123456", "VF112345678123456"
}; };
string[] testMarks = { string[] testMarks = {
// 1. Последовательная серия (проверка инкремента цифр) // 1. Последовательная серия (проверка инкремента цифр)
@@ -70,7 +69,7 @@ namespace ConsoleApp1
"A025AA29", "B026BB30", "E027EE31", "K028KK32", "M029MM33", "H030HH34", "O031OO35", "P032PP36", "A025AA29", "B026BB30", "E027EE31", "K028KK32", "M029MM33", "H030HH34", "O031OO35", "P032PP36",
"C033CC37", "T034TT38", "Y035YY39", "X036XX40", "A037AA41", "B038BB42", "E039EE43", "K040KK44", "C033CC37", "T034TT38", "Y035YY39", "X036XX40", "A037AA41", "B038BB42", "E039EE43", "K040KK44",
"M041MM45", "H042HH46", "O043OO47", "P044PP48", "C045CC49", "T046TT50", "Y047YY51", "X048XX52", "M041MM45", "H042HH46", "O043OO47", "P044PP48", "C045CC49", "T046TT50", "Y047YY51", "X048XX52",
"A100AA177", "B200BB197", "E300EE199", "K400KK777" "A100AA177", "B200BB197", "E300EE199", "M999MP159"
}; };
/* /*
int i = 0; int i = 0;
@@ -83,13 +82,14 @@ namespace ConsoleApp1
j++; j++;
Console.WriteLine($"Страна: {VIN_LIB.VIN.GetVINCountry(v)}"); Console.WriteLine($"Страна: {VIN_LIB.VIN.GetVINCountry(v)}");
Console.WriteLine($"Вин номер: {(VIN_LIB.VIN.CheckVIN(v) ? "Верный" : "Не верный")}"); Console.WriteLine($"Вин номер: {(VIN_LIB.VIN.CheckVIN(v) ? "Верный" : "Не верный")}");
Console.WriteLine($"{v}");
Console.WriteLine($"Год: {VIN_LIB.VIN.GetTransportYear(v)}"); Console.WriteLine($"Год: {VIN_LIB.VIN.GetTransportYear(v)}");
} }
Console.WriteLine($"Успешно: {i}"); Console.WriteLine($"Успешно: {i}");
Console.WriteLine($"Не успешно: {j}"); Console.WriteLine($"Не успешно: {j}");
Console.ReadLine(); Console.ReadLine();*/
*/
int i = 0; int i = 0;
int j = 0; int j = 0;
foreach (string v in testMarks) foreach (string v in testMarks)
@@ -110,6 +110,7 @@ namespace ConsoleApp1
Console.WriteLine($"Номер ТС: Верный"); Console.WriteLine($"Номер ТС: Верный");
Console.WriteLine($"Текущая марка: {v} \t Следующая марка: {nextMark}"); Console.WriteLine($"Текущая марка: {v} \t Следующая марка: {nextMark}");
Console.WriteLine($"Интервал до {rangeEnd}: {nextInRange}"); Console.WriteLine($"Интервал до {rangeEnd}: {nextInRange}");
Console.WriteLine($"Возможное кол-во {REG_MARK_LIB.REG_MARK.GetCombinationsCountInRange(v,rangeEnd)}");
} }
else else
{ {

View File

@@ -5,8 +5,6 @@ VisualStudioVersion = 17.13.35919.96
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VIN-LIB", "VIN-LIB\VIN-LIB.csproj", "{78203663-3306-4E81-922F-1A5A939A22BC}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VIN-LIB", "VIN-LIB\VIN-LIB.csproj", "{78203663-3306-4E81-922F-1A5A939A22BC}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{714254CA-DDE4-42B2-8077-38D9F565C70F}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU 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}.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.ActiveCfg = Release|Any CPU
{78203663-3306-4E81-922F-1A5A939A22BC}.Release|Any CPU.Build.0 = 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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -178,6 +178,9 @@ namespace VIN_LIB
return true; return true;
return false; return false;
} }
public static char CalculateCheckDigit(string vin) public static char CalculateCheckDigit(string vin)
{ {
int GetValue(char c) int GetValue(char c)
@@ -225,21 +228,17 @@ namespace VIN_LIB
if (string.IsNullOrEmpty(vin) || vin.Length < 10) if (string.IsNullOrEmpty(vin) || vin.Length < 10)
return 0; return 0;
// Год — это всегда 10-й символ VIN (индекс 9)
char yearCode = char.ToUpper(vin[9]); char yearCode = char.ToUpper(vin[9]);
if (YearCodes.TryGetValue(yearCode, out int baseYear)) if (YearCodes.TryGetValue(yearCode, out int baseYear))
{ {
// Поскольку коды повторяются каждые 30 лет (A было в 1980 и снова в 2010),
// нужно определить, к какому периоду относится авто.
// Современные системы обычно проверяют текущий год.
int currentYear = DateTime.Now.Year; int currentYear = DateTime.Now.Year;
int year = baseYear; int year = baseYear;
// Если машина из будущего (например, код 'A' и сейчас 2024 год),
// значит это 2010 год, а не 1980. while (year + 30 <= currentYear + 1)
while (year + 30 <= currentYear + 1) // +1, так как модельный год может обгонять календарный
{ {
year += 30; year += 30;
} }
@@ -249,7 +248,7 @@ namespace VIN_LIB
return 0; return 0;
} }
public static bool CheckVIS(string vin) /*public static bool CheckVIS(string vin)
{ {
if (string.IsNullOrEmpty(vin) || vin.Length < 17) if (string.IsNullOrEmpty(vin) || vin.Length < 17)
return false; return false;
@@ -271,6 +270,51 @@ namespace VIN_LIB
if (!CheckVIS(vin)) if (!CheckVIS(vin))
return false; return false;
return true; 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;
} }
} }
} }