3

我需要一个可以根据用户输入计算校验和的小程序。

不幸的是,我所知道的校验和是它对数据包中的所有数据进行异或。

我试图在网上搜索一个例子,但没有任何运气。

我知道我是否有一个字符串: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

这将导致校验和为 6A。

希望有人可以帮助我。如果有人有一个用 Python 3 编写的示例,也可以为我工作

4

2 回答 2

4

干得好:

unsigned char *packet;
unsigned char xor = 0;
for ( int i = 0 ; i < packet_len ; i ++ ) {
   xor = xor ^ packet[i];
}
// xor has the required checksum
于 2010-07-09T17:52:29.940 回答
4

如果我正确理解“异或数据包中的所有数据”,那么您应该执行以下操作:

#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(不能是十六进制数)。您将打印校验和。

于 2010-07-09T17:54:11.607 回答