или все данные в пакете - PullRequest
3 голосов
/ 09 июля 2010

Мне нужна небольшая программа, которая может вычислить контрольную сумму из пользовательского ввода.

К сожалению, все, что я знаю о контрольной сумме, это то, что она или все данные в пакете.

Я безуспешно пытался найти в сети пример.

Я знаю, есть ли у меня строка: 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 ]

4 голосов
/ 09 июля 2010

Вот, пожалуйста:

unsigned char *packet;
unsigned char xor = 0;
for ( int i = 0 ; i < packet_len ; i ++ ) {
   xor = xor ^ packet[i];
}
// xor has the required checksum
3 голосов
/ 09 июля 2010

Если я правильно понимаю «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» (не может быть шестнадцатеричным числом). Вы получите распечатанную контрольную сумму.

...