#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";
}
Соседние файлы в папке кейс