Или все данные в пакете
Мне нужна небольшая программа, которая может вычислить контрольную сумму из пользовательского ввода.
К сожалению, все, что я знаю о контрольной сумме, это то, что это xor всех данных в пакете.
Я попытался найти в сети пример без какой-либо удачи.
Я знаю, если у меня есть строка: 41,4D,02,41,21,04,02,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
Это должно привести к контрольной сумме 6А.
Надеюсь, кто-нибудь сможет мне помочь. Если у кого-то есть пример, написанный на Python 3, он также может работать для меня
2 ответа
Если я правильно понимаю "xor all data in package", то вы должны сделать что-то вроде этого:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
unsigned int data;
vector< unsigned int > alldata;
cout << "Enter a byte (in hex format, ie: 3A ) anything else print the checksum of previous input: ";
while ( true )
{
cin >> hex >> data;
if ( cin.fail() || cin.bad() )
break;
alldata.push_back( data );
cout << "Enter a byte: ";
}
unsigned int crc = 0;
for ( int i = 0; i < alldata.size(); i++ )
crc ^= alldata[ i ];
cout << endl << "The checksum is: " << hex << uppercase << crc << endl;
system( "pause" );
return 0;
}
Идея состоит в том, чтобы установить переменную, инициализированную в 0, а затем переписать все элементы пакета вместе с ней, сохраняя результат операции в одной и той же переменной на каждом шаге.
РЕДАКТИРОВАТЬ: отредактировал ответ, чтобы обеспечить полный рабочий пример (далеко не идеально, но работает). Использование: введите байты по мере необходимости, как только вы закончите ввод, введите что-нибудь недопустимое, например, "q" (не может быть шестнадцатеричным числом). Вы получите распечатанную контрольную сумму.
Ну вот:
unsigned char *packet;
unsigned char xor = 0;
for ( int i = 0 ; i < packet_len ; i ++ ) {
xor = xor ^ packet[i];
}
// xor has the required checksum