3

ユーザー入力からチェックサムを計算できる小さなプログラムが必要です。

残念ながら、チェックサムについて私が知っているのは、それがパケット内のすべてのデータの 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

これにより、チェックサムが 6A になるはずです。

うまくいけば、誰かが私を助けてくれます。誰かがPython 3で書かれた例を持っているなら、私のためにも働くことができます

4

2 に答える 2

4

「パケット内のすべてのデータの xor」を正しく理解している場合は、次のようにする必要があります。

#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それを使用してパケットのすべての要素を xor し、各ステップで同じ変数に操作の結果を格納することです。

編集:完全な実例を提供するために回答を編集しました(完璧にはほど遠いですが、機能します)。使用法: 必要に応じてバイトを入力します。入力が終了したら、無効なものを入力しますq(16 進数は使用できません)。チェックサムが出力されます。

于 2010-07-09T17:54:11.607 に答える
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 に答える