2010-04-04 3 views
0

J'envoie un tableau d'octets à un élément matériel.Comment calculer le plus petit octet de signal en Ruby

Les 7 premiers octets contiennent des données et le 8ème octet est une somme de contrôle.

Le 8ème octet est l'octet le moins significatif de la somme des 7 premiers octets. Exemples contenant la somme de contrôle correcte.

Le dernier octet de chacun d'entre eux est la somme de contrôle

200-30-7-5-1-2-0-245

42-0-0-1-176-0-148-39

42-0-0-3-177-0-201-118

Comment calculer la somme de contrôle?

Merci, Seth

Répondre

1

même que dans C: prendre la somme et 'au niveau du bit' avec 255 (ou 0xFF en hexadécimal). En utilisant votre premier ensemble de données comme exemple:

arr = [ 200, 30, 7, 5, 1, 2, 0 ] 

sum = 0 
arr.each do |val| 
    sum += val 
end 
checksum = sum & 0xff 

print checksum 
+0

merci pour la réponse rapide. J'ai essayé votre méthode avec les 2ème et 3ème jeux de données et cela me donne une réponse différente de la somme de contrôle incluse dans les exemples. Quelque chose que je manque? –

+1

Les seules choses auxquelles je peux penser sont que soit la somme de contrôle est quelque chose de différent que simplement additionner les valeurs modulo 256 ou que les exemples de données sont faux. Essayer les calculs à la main correspond à l'extrait de programme (c'est-à-dire que les 2e et 3e jeux de données ne fonctionnent pas). –

+0

J'ai compris la plupart de ce qui n'allait pas. La documentation est médiocre, mais il semble que les commandes commençant par 42 concernent tous les périphériques du réseau et n'ont pas de paramètres qui changent de sorte que la somme de contrôle des deux derniers jeux de données est fournie et non calculée comme la première. –

1

Les objets de chaîne ont un certain nombre de méthodes pour la manipulation directe d'octets.

1

une courte distance de l'écrire serait

arr.inject { |sum, val| sum += val } & 0xFF

Mais comme précédemment découvert, cela produit une somme de contrôle différent pour votre deuxième et troisième exemples. Il semble que les exemples soient incorrects ou que le calcul de la somme de contrôle ne soit pas aussi simple que de prendre l'octet le moins significatif.

Questions connexes