2010-07-09 16 views
3

J'ai besoin d'un petit programme qui peut calculer la somme de contrôle à partir d'une entrée de l'utilisateur. Malheureusement, tout ce que je sais sur la somme de contrôle, c'est que c'est xor toutes les données dans le paquet.xou toutes les données dans le paquet

J'ai essayé de chercher un exemple sur Internet sans aucune chance.

Je sais si j'ai une chaîne: 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

Ceci devrait donner une somme de contrôle de 6A.

J'espère que quelqu'un pourrait m'aider. Si quelqu'un a un exemple écrit en Python 3, pourrait aussi travailler pour moi

+0

Est-ce réellement un XOR de chaque * octet *? Je m'attendrais à ce que les checksums soient plus grands que cela: peut-être des groupes XORing de 2 ou 4 octets. – Karmastan

+0

J'ai édité ma réponse pour vous fournir un échantillon de code complet. – PeterK

Répondre

3

Si je comprends « XOR toutes les données en paquets » correctement, alors vous devriez faire quelque chose comme ceci:

#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; 

}

l'idée est d'établir une variable initialisée à 0 puis XOR tous les éléments du paquet avec elle tout en stockant le résultat de l'opération dans la même variable sur e une étape.

EDIT: la réponse à modifié fournir des exemples de travail complet (loin d'être parfait, mais fonctionne). Utilisation: entrez les octets comme requis, une fois que vous avez terminé avec l'entrée, entrez quelque chose d'invalide, par exemple 'q' (ne peut pas être un nombre hexadécimal). Vous obtiendrez la somme de contrôle imprimée.

+0

Salut PeterK Votre exemple fonctionne perfekt pour moi a besoin Merci d'avoir pris le temps de le faire. Je l'apprécie beaucoup – Brian

+0

@Brian: Je suis heureux d'avoir pu vous aider. S'il vous plaît vérifier cela comme une réponse acceptée, il est considéré comme poli. Merci, Peter – PeterK

+0

Salut Peter. J'essayais de cliquer sur "Cette réponse est utile" mais je ne pouvais pas, parce que je n'ai pas 15 réputation. J'ai juste raté l'autre option. – Brian

3

vous allez ici:

unsigned char *packet; 
unsigned char xor = 0; 
for (int i = 0 ; i < packet_len ; i ++) { 
    xor = xor^packet[i]; 
} 
// xor has the required checksum 
+0

Merci pour l'exemple. Je vais essayer ceci – Brian

+0

Puis-je vous demander de remplir la partie avec une entrée utilisateur? Donc je peux juste le compiler? Je n'ai utilisé que Python 3 auparavant, donc je suis nouveau pour C++. – Brian