Добавил:
ИВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

кейс / Interface

.txt
Скачиваний:
0
Добавлен:
27.09.2023
Размер:
3.62 Кб
Скачать
#include <iostream>
#include <vector>
#include <typeinfo>
#include <bitset>

#define M 12
#define N 3
#define BIT_IN_CADR 3

using namespace std;

vector<string> decoder(vector<string> package, int &errors_counter)
{
	errors_counter = 0;
	vector<string> data;
	for (int i = 0; i < package.size(); i++)
	{
		string cadr = package[i];

		if (cadr != "11111111")
		{
			errors_counter += (cadr[0] == cadr[3]) + (cadr[1] == cadr[4]) + (cadr[2] == cadr[5]);
			errors_counter += ((int(cadr[0]) + int(cadr[1]) + int(cadr[2]) - '0'*3) % 2 != int(cadr[6] - '0'));
			data.push_back(cadr.substr(0, 3));
		}
	}
	return data;
}


string HEX_decoder(string order)
{
	string binstr;
	for (int i = 0; i < order.size(); i++)
	{
		switch (order[i])
		{
			case '0':
				binstr.append("0000");
				break;
			case '1':
				binstr.append("0001");
				break;
			case '2':
				binstr.append("0010");
				break;
			case '3':
				binstr.append("0011");
				break;
			case '4':
				binstr.append("0100");
				break;
			case '5':
				binstr.append("0101");
				break;
			case '6':
				binstr.append("0110");
				break;
			case '7':
				binstr.append("0111");
				break;
			case '8':
				binstr.append("1000");
				break;
			case '9':
				binstr.append("1001");
				break;
			case 'A':
				binstr.append("1010");
				break;
			case 'B':
				binstr.append("1011");
				break;
			case 'C':
				binstr.append("1100");
				break;
			case 'D':
				binstr.append("1101");
				break;
			case 'E':
				binstr.append("1110");
				break;
			case 'F':
				binstr.append("1111");
				break;
		}
	}
	return binstr;
}

vector<vector<string>> PackageCreator(string order)
{
	vector<vector<string>> packages;
	string bin_order = HEX_decoder(order);
	int counter = M / N + 1;


	cout << "Бинарный вид: ";
	for (int i = 0; i < bin_order.size(); i++)
	{
		cout << bin_order[i];
	}
	cout << endl;


	for (int i = 0; i < bin_order.size() - 7; i++)
	{
		
		if (bin_order.substr(i, 8) == "11111111")
		{
			counter = 0;
			packages.push_back({});
		}

		if (counter < M / N + 1)
		{
			packages[packages.size() - 1].push_back(bin_order.substr(i, 8));
			counter += 1;
			i = i + 7;
		}
	}
	
	for (int i = 0; i < packages.size(); i++)
	{
		cout << "\nPack_" << i << ": ";

		for (int j = 0; j < packages[i].size(); j++)
		{
			cout << " ";

			for (int k = 0; k < packages[i][j].size(); k++)
			{
				cout << packages[i][j][k];
			}
		}
	}
	cout << endl;
	return packages;
}


int main()
{
	setlocale(LC_ALL, "Rus");
	string order = "FF1DE3A9A90000FF1DE3A9A9000FF1DE3A91D";

	while (1)
	{
		cout << "Введите посылку" << endl;
		cin >> order;

		if (order == "end")
		{
			break;
		}

		cout << "Посылка: ";
		for (int i = 0; i < order.size(); i++)
		{
			cout << order[i];
		}
		cout << endl;

		vector<vector<string>> packages = PackageCreator(order);

		int errors_counter;

		for (int i = 0; i < packages.size(); i++)
		{
			vector<string> package = packages[i];
			vector<string> data_package = decoder(package, errors_counter);
			if (errors_counter == 0 && data_package.size() == 4)
			{
				cout << "\nДанные с датчика номер " << i << ": ";
				for (int i = 0; i < data_package.size(); i++)
				{
					cout << data_package[i];
				}
			}
			else
			{
				cout << "\nДанные о датчике номер " << i << " пришли поврежденными." << endl;
			}
		}
		cout << "\n\n\n";

	}
	
	cout << "\n\n\n";
}
Соседние файлы в папке кейс