First try

This commit is contained in:
GitLab-Admin
2026-03-31 08:33:56 +05:00
commit 73c84ae27e
14 changed files with 714 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
.vs/
[Bb]in/
[Oo]bj/
*.user

View File

@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35919.96 d17.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8F1FCDD4-4F57-428F-AC1D-917430EFC911}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp1</RootNamespace>
<AssemblyName>ConsoleApp1</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="VIN-LIB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\VIN-LIB\VIN-LIB\bin\Debug\VIN-LIB.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VIN_LIB;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
string[] testVins = new string[]
{
// РОССИЯ (XTA - АвтоВАЗ, X7L - Renault)
"XTA210700L1234567", "XTA211400M1234567", "X7LHSR450J1234567", "XTA11183091234567", "XTA210900V1234567",
// ГЕРМАНИЯ (WBA - BMW, WVG - VW, WDC - Mercedes)
"WBA316000K1234567", "WVWZZZ1JZ1W123456", "WDC1690311J123456", "WBA530D00L1234567", "WVGZZZ5NZCW123456",
// США (1FA - Ford, 1GC - Chevrolet)
"1FA6P8CF0E1234567", "1G6AF57V041234567", "1FMEU34E071234567", "1GCGK23G0B1234567", "1FM5K8GT0H1234567",
// ЯПОНИЯ (JTD - Toyota, JHM - Honda)
"JTD12345678123456", "JHMRE485081234567", "JTDKB22U001234567", "JHMCV1650C1234567", "JTDGX31P0E1234567",
// ЮЖНАЯ КОРЕЯ (KNA - Kia, KMH - Hyundai)
"KNAJP241261234567", "KMHCT41M0A1234567", "KNAKU4120D1234567", "KMHSH51J0B1234567", "KNAJX5240L1234567",
// МАЛЫЕ ПРОИЗВОДИТЕЛИ (3-й символ '9')
// Здесь страна определяется по 12-14 символам (в примерах это X39 - Россия)
"X3912345678X39456", "W0912345678W09123", "Y9912345678Y99123", "Z9912345678Z99123", "99912345678999123",
// ФРАНЦИЯ И ИТАЛИЯ (VF3 - Peugeot, ZFA - Fiat)
"VF3CC8HZB81234567", "ZFA18200001234567", "VF7LC5FW091234567", "ZAR93900001234567", "VF32CKFVC21234567",
// РАЗНЫЕ РЕГИОНЫ (Китай, Великобритания, Швеция)
"LSV12345678123456", "SAL12345678123456", "YS312345678123456", "LNV12345678123456", "SAB12345678123456",
// ДОПОЛНИТЕЛЬНЫЕ (Казахстан, Узбекистан, Чехия)
"KS112345678123456", "XWB12345678123456", "TMB12345678123456", "KZC12345678123456", "XW812345678123456",
"3HG12345678123456", "8AW12345678123456", "6AB12345678123456", "VSS12345678123456", "Y3B12345678123456"
};
/*
string vin = "Z9111070060057018";
string Euvin = "XW8AG4NH7KK108004";
if (VIN_LIB.VIN.CheckVIN(Euvin))
Console.WriteLine("Вин годен");
else
Console.WriteLine("Вин не годен");
Console.WriteLine(VIN_LIB.VIN.GetVINCountry(vin));
Console.WriteLine(VIN_LIB.VIN.GetTransportYear(vin));
var a = VIN_LIB.VIN.GetVinCountries();
int i = 0;
foreach ( var c in a)
{
i++;
Console.WriteLine($"Ключ: {c.Key} Страна: {c.Value} Строка: {i}");
}*/
int i = 0;
int j = 0;
foreach (string v in testVins)
{
if (VIN_LIB.VIN.CheckVIN(v))
i++;
else
j++;
Console.WriteLine($"Страна: {VIN_LIB.VIN.GetVINCountry(v)}");
Console.WriteLine($"Вин номер: {(VIN_LIB.VIN.CheckVIN(v) ? "Верный" : "Не верный")}");
Console.WriteLine($"Год: {VIN_LIB.VIN.GetTransportYear(v)}");
}
Console.WriteLine($"Успешно: {i}");
Console.WriteLine($"Не успешно: {j}");
Console.ReadLine();
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Общие сведения об этой сборке предоставляются следующим набором
// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
// связанные с этой сборкой.
[assembly: AssemblyTitle("ConsoleApp1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("ConsoleApp1")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// из модели COM задайте для атрибута ComVisible этого типа значение true.
[assembly: ComVisible(false)]
// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
[assembly: Guid("f7bbffb9-4067-4ae0-9e6d-88c23e7b6a78")]
// Сведения о версии сборки состоят из указанных ниже четырех значений:
//
// Основной номер версии
// Дополнительный номер версии
// Номер сборки
// Номер редакции
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{714254CA-DDE4-42B2-8077-38D9F565C70F}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp1</RootNamespace>
<AssemblyName>ConsoleApp1</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="VIN-LIB, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\VIN-LIB\bin\Release\VIN-LIB.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VIN_LIB;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
string vin = "Z9MCM56557C404453";
if (VIN_LIB.VIN.CheckVIN(vin))
Console.WriteLine("Вин годен");
VIN_LIB.VIN.GetVINCountry(vin);
Console.ReadLine();
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Общие сведения об этой сборке предоставляются следующим набором
// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
// связанные с этой сборкой.
[assembly: AssemblyTitle("ConsoleApp1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("ConsoleApp1")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// из модели COM задайте для атрибута ComVisible этого типа значение true.
[assembly: ComVisible(false)]
// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
[assembly: Guid("714254ca-dde4-42b2-8077-38d9f565c70f")]
// Сведения о версии сборки состоят из указанных ниже четырех значений:
//
// Основной номер версии
// Дополнительный номер версии
// Номер сборки
// Номер редакции
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

31
VIN-LIB/VIN-LIB.sln Normal file
View File

@@ -0,0 +1,31 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
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
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{78203663-3306-4E81-922F-1A5A939A22BC}.Debug|Any CPU.ActiveCfg = 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.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
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {309FDFE6-0A5F-4D5A-93A0-87FF7F7F2348}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Общие сведения об этой сборке предоставляются следующим набором
// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
// связанные со сборкой.
[assembly: AssemblyTitle("VIN-LIB")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("VIN-LIB")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
[assembly: ComVisible(false)]
// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
[assembly: Guid("78203663-3306-4e81-922f-1a5a939a22bc")]
// Сведения о версии сборки состоят из указанных ниже четырех значений:
//
// Основной номер версии
// Дополнительный номер версии
// Номер сборки
// Редакция
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{78203663-3306-4E81-922F-1A5A939A22BC}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>VIN_LIB</RootNamespace>
<AssemblyName>VIN-LIB</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="VIN.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

276
VIN-LIB/VIN-LIB/VIN.cs Normal file
View File

@@ -0,0 +1,276 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIN_LIB
{
public class VIN
{
public static Dictionary<string, string> GetVinCountries()
{
var countries = new Dictionary<string, string>();
//Африка
SdelatInterval(countries, "AA", "AH", "ЮАР");
SdelatInterval(countries, "AJ", "AN", "Кот-д’Ивуар");
SdelatInterval(countries, "BA", "BE", "Ангола");
SdelatInterval(countries, "BF", "BK", "Кения");
SdelatInterval(countries, "BL", "BR", "Танзания");
SdelatInterval(countries, "CA", "CE", "Бенин");
SdelatInterval(countries, "CF", "CK", "Мадагаскар");
SdelatInterval(countries, "CL", "CR", "Тунис");
SdelatInterval(countries, "DA", "DE", "Египет");
SdelatInterval(countries, "DF", "DK", "Марокко");
SdelatInterval(countries, "DL", "DR", "Замбия");
SdelatInterval(countries, "EA", "EE", "Эфиопия");
SdelatInterval(countries, "EF", "EK", "Мозамбик");
SdelatInterval(countries, "FA", "FE", "Гана");
SdelatInterval(countries, "FF", "FK", "Нигерия");
//Азия
SdelatInterval(countries, "JA", "JT", "Япония");
SdelatInterval(countries, "KA", "KE", "Шри Ланка");
SdelatInterval(countries, "KF", "KK", "Израиль");
SdelatInterval(countries, "KL", "KR", "Южная Корея");
SdelatInterval(countries, "KS", "K0", "Казахстан");
SdelatInterval(countries, "LA", "L0", "Китай");
SdelatInterval(countries, "MA", "ME", "Индия");
SdelatInterval(countries, "MF", "MK", "Индонезия");
SdelatInterval(countries, "ML", "MR", "Таиланд");
SdelatInterval(countries, "NF", "NK", "Пакистан");
SdelatInterval(countries, "NL", "NR", "Турция");
SdelatInterval(countries, "PA", "PE", "Филиппины");
SdelatInterval(countries, "PF", "PK", "Сингапур");
SdelatInterval(countries, "PL", "PR", "Малайзия");
SdelatInterval(countries, "RA", "RE", "ОАЭ");
SdelatInterval(countries, "RF", "RK", "Тайвань");
SdelatInterval(countries, "RL", "RR", "Вьетнам");
SdelatInterval(countries, "RS", "R0", "Саудовская Аравия");
// Европа
SdelatInterval(countries, "SA", "SM", "Великобритания");
SdelatInterval(countries, "SN", "ST", "Германия");
SdelatInterval(countries, "SU", "SZ", "Польша");
SdelatInterval(countries, "S1", "S4", "Латвия");
SdelatInterval(countries, "TA", "TH", "Швейцария");
SdelatInterval(countries, "TJ", "TP", "Чехия");
SdelatInterval(countries, "TR", "TV", "Венгрия");
SdelatInterval(countries, "TW", "T1", "Португалия");
SdelatInterval(countries, "UH", "UM", "Дания");
SdelatInterval(countries, "UN", "UT", "Ирландия");
SdelatInterval(countries, "UU", "UZ", "Румыния");
SdelatInterval(countries, "U5", "U7", "Словакия");
SdelatInterval(countries, "VA", "VE", "Австрия");
SdelatInterval(countries, "VF", "VR", "Франция");
SdelatInterval(countries, "VS", "VW", "Испания");
SdelatInterval(countries, "VX", "V2", "Сербия");
SdelatInterval(countries, "V3", "V5", "Хорватия");
SdelatInterval(countries, "V6", "V0", "Эстония");
SdelatInterval(countries, "WA", "W0", "Германия");
SdelatInterval(countries, "XA", "XE", "Болгария");
SdelatInterval(countries, "XF", "XK", "Греция");
SdelatInterval(countries, "XL", "XR", "Нидерланды");
SdelatInterval(countries, "XS", "XW", "СССР/СНГ");
SdelatInterval(countries, "XX", "X2", "Люксембург");
SdelatInterval(countries, "X3", "X0", "Россия");
SdelatInterval(countries, "YA", "YE", "Бельгия");
SdelatInterval(countries, "YF", "YK", "Финляндия");
SdelatInterval(countries, "YL", "YR", "Мальта");
SdelatInterval(countries, "YS", "YW", "Швеция");
SdelatInterval(countries, "YX", "Y2", "Норвегия");
SdelatInterval(countries, "Y3", "Y5", "Беларусь");
SdelatInterval(countries, "Y6", "Y0", "Украина");
SdelatInterval(countries, "ZA", "ZR", "Италия");
SdelatInterval(countries, "ZX", "Z2", "Словения");
SdelatInterval(countries, "Z3", "Z5", "Литва");
SdelatInterval(countries, "Z6", "Z0", "Россия");
// Америка
SdelatInterval(countries, "1A", "10", "США");
SdelatInterval(countries, "2A", "20", "Канада");
SdelatInterval(countries, "3A", "3W", "Мексика");
SdelatInterval(countries, "3X", "37", "Коста-Рика");
SdelatInterval(countries, "38", "30", "Каймановы острова");
SdelatInterval(countries, "4A", "40", "США");
SdelatInterval(countries, "5A", "50", "США");
// Океания
SdelatInterval(countries, "6A", "6W", "Австралия");
SdelatInterval(countries, "7A", "7E", "Новая Зеландия");
// Юж Америка
SdelatInterval(countries, "8A", "8E", "Аргентина");
SdelatInterval(countries, "8F", "8K", "Чили");
SdelatInterval(countries, "8L", "8R", "Эквадор");
SdelatInterval(countries, "8S", "8W", "Перу");
SdelatInterval(countries, "8X", "82", "Венесуэла");
SdelatInterval(countries, "9A", "9E", "Бразилия");
SdelatInterval(countries, "9F", "9K", "Колумбия");
SdelatInterval(countries, "9L", "9R", "Парагвай");
SdelatInterval(countries, "9S", "9W", "Уругвай");
SdelatInterval(countries, "9X", "92", "Тринидад и Тобаго");
SdelatInterval(countries, "93", "99", "Бразилия");
return countries;
}
public static char[] allowedChars = "ABCDEFGHJKLMNPRSTUVWXYZ1234567890".ToCharArray();
private static void SdelatInterval(Dictionary<string, string> dict, string start, string end, string country)
{
bool started = false;
// Перебираем все возможные комбинации из двух символов
foreach (char c1 in allowedChars)
{
foreach (char c2 in allowedChars)
{
string current = $"{c1}{c2}";
if (current == start) started = true;
if (started)
{
if (!dict.ContainsKey(current))
dict.Add(current, country);
if (current == end) return;
}
}
}
}
public static string GetVINCountry(string vin)
{
if (string.IsNullOrEmpty(vin) || vin.Length < 17)
return "Некорректный VIN";
string countryCode;
// Проверка правила "менее 500 автомобилей в год"
if (vin[2] == '9')
{
countryCode = vin.Substring(11, 2);
}
else
{
countryCode = vin.Substring(0, 2);
}
if (GetVinCountries().TryGetValue(countryCode, out string countryName))
{
return countryName;
}
return "Страна не определена";
}
public static bool CheckWMI(string vin)
{
string code = vin.Substring(0, 2);
if (GetVinCountries().TryGetValue(code, out string country))
{
return true;
}
return false;
}
public static bool CheckVDS(string vin)
{
if (vin[8] == CalculateCheckDigit(vin))
return true;
return false;
}
public static char CalculateCheckDigit(string vin)
{
int GetValue(char c)
{
if (char.IsDigit(c)) return c - '0';
switch (c)
{
case 'A': case 'J': return 1;
case 'B': case 'K': case 'S': return 2;
case 'C': case 'L': case 'T': return 3;
case 'D': case 'M': case 'U': return 4;
case 'E': case 'N': case 'V': return 5;
case 'F': case 'P': case 'W': return 6;
case 'G': case 'R': case 'X': return 7;
case 'H': case 'Y': return 8;
case 'Z': return 9;
default: return 0;
}
}
int[] weights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 };
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += GetValue(vin[i]) * weights[i];
}
int remainder = sum % 11;
if (remainder == 10) return 'X';
return (char)(remainder + '0');
}
private static readonly Dictionary<char, int> YearCodes = new Dictionary<char, int>
{
{'A', 1980}, {'B', 1981}, {'C', 1982}, {'D', 1983}, {'E', 1984}, {'F', 1985}, {'G', 1986}, {'H', 1987}, {'J', 1988}, {'K', 1989},
{'L', 1990}, {'M', 1991}, {'N', 1992}, {'P', 1993}, {'R', 1994}, {'S', 1995}, {'T', 1996}, {'V', 1997}, {'W', 1998}, {'X', 1999},
{'Y', 2000}, {'1', 2001}, {'2', 2002}, {'3', 2003}, {'4', 2004}, {'5', 2005}, {'6', 2006}, {'7', 2007}, {'8', 2008}, {'9', 2009}
};
public static int GetTransportYear(string vin)
{
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, так как модельный год может обгонять календарный
{
year += 30;
}
return year;
}
return 0;
}
public static bool CheckVIS(string vin)
{
if (string.IsNullOrEmpty(vin) || vin.Length < 17)
return false;
for (int i = 13; i < 17; i++)
{
if (!char.IsDigit(vin[i])) return false;
}
return true;
}
public static bool CheckVIN(string vin)
{
if (string.IsNullOrEmpty(vin) || vin.Length < 17)
return false;
if(!CheckWMI(vin))
return false;
if (!CheckVDS(vin))
return false;
if (!CheckVIS(vin))
return false;
return true;
}
}
}