diff options
Diffstat (limited to 'src/Utils.py')
-rw-r--r-- | src/Utils.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/Utils.py b/src/Utils.py new file mode 100644 index 0000000..3618dfd --- /dev/null +++ b/src/Utils.py @@ -0,0 +1,105 @@ +# -*- coding: iso-8859-1 -*- + +############################################################################### +##### fichier contenant la classe en charge du ############### +##### calcul du CRC CCITT16 ############### +############################################################################### + +# imports des modules python a utiliser +import os + +# declaration des constantes à utiliser pour travail sur les bits +CRC_POLYNOMIAL = 0x00102100 +TAIL_CANCELLING_MASK = 0xFFFFFF00 +HEADER_TAIL_CANCELLING_MASK = 0x00FFFF00 +LSB_HEADER_TESTING_MASK = 0x01000000 +NULL_VALUE = 0x00000000 +REMAINDER_CANCELLING_MASK = 0xFF0000FF +INIT_VALUE = 0x00FFFF00 + +## +# classe CalcCRC +# cette classe permet de calculer une CRC CCITT sur 16 bits à partir d'une string +# +class CalcCRC: + + ## + # initialisation des polynomes de controles + # + def __init__(self): + self.CRC_POLYNOMIAL = 0x00102100 + self.cancellingMask = 0xFFFFFF00 + self.testingMask = 0x01000000 + self.value = 0x00000000 + + ## + # methode decalageGauche + # methode effectuant un decalage a gauche des bits de l'attribut value + # le bit de poids le plus fort de tail va dans le bit de poid faible de remainder et le bit de poids fort de remainder + # dans le bit de poids faible du header + # + def decalageGauche(self): + self.value = self.value << 1 + + ## + # methode insertNewValue + # methode permettant d'ajouter a la fin de value la valeur du nouvel octet + # @param byteValue : nouvel octet à mettre à la fin de l'attribut value + # + def insertNewValue(self, byteValue): + intermediaire = self.value & TAIL_CANCELLING_MASK + self.value = intermediaire | byteValue + + ## + # methode remainderDivision + # methode effectuant la division du reste par le polynome de controle + # + def remainderDivision(self): + intermediaire = self.value + intermediaire = intermediaire & HEADER_TAIL_CANCELLING_MASK + intermediaire = intermediaire ^ CRC_POLYNOMIAL + intermediaire = intermediaire & HEADER_TAIL_CANCELLING_MASK + nullRemainder = self.value & REMAINDER_CANCELLING_MASK + self.value = intermediaire | nullRemainder + + ## + # methode calcCCITTCRC16 + # methode calculant le CRC d'un message ASCII et le retournant + # @param message : message dont on veut calculer le CRC + # @return la valeur du CRC + # + def calcCCITTCRC16(self, message): + # initialisation de la variable de calcul + self.value = INIT_VALUE + # pour chaque octet du message effectue le calcul du CRC + for value in message : + self.calcCRC(ord(value)) + + self.calcCRC(0x00) + self.calcCRC(0x00) + + return (self.value & HEADER_TAIL_CANCELLING_MASK) >> 8 + + ## + # methode calcCRC + # methode calculant le reste de la division polynomial + # @param byteValue : nouvel octet + # + def calcCRC(self, byteValue): + # on range la nouvelle valeur dans le registre de calcul self.value + self.insertNewValue(byteValue) + + # on effectue la division + for test in range(8): + self.decalageGauche() + if (self.value & LSB_HEADER_TESTING_MASK) != NULL_VALUE : + self.remainderDivision() + else : + pass + + +if __name__ == '__main__': + message = 'A' + crcCalculator = CalcCRC() + crcCalculator.calcCCITTCRC16(message) +
\ No newline at end of file |