Discussion: Calcul de CRC 64 bits

  1. #1
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 027
    Points : 15 578
    Points
    15 578

    Par défaut Calcul de CRC 64 bits

    Suite a une discussion sur le forum, voici deux exemples de code JAVA pour calculer un CRC 64bits.

    Methode 1 (dite "slow-byte"):
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public static long crc64_slow(char[] sequence) {
    	// x64 + x4 + x3 + x1 + 1
    	long POLY64 = 0x000000000000001BL;
    	long POLY64Reverse = 0xd800000000000000L;
     
    	long reminder = 0;
    	for(int i=0;i<sequence.length;i++) {
     
    		reminder = reminder ^ sequence[i];
     
    		for (int bit=7;bit>=0;bit--) {
    			if ( (reminder & 0x1)==1) {
    				reminder = (reminder >>> 1)^ POLY64Reverse;
    			} else {
    				reminder = (reminder >>> 1);
    			}
    		}
    	}
    	return reminder;
    }
     
    public static void main(String[] args) {
    	long crc = 0;
    	String s = "123456789"; // CRC64 = 46A5A9388A5BEFFE
     
    	crc = crc64_slow(s.toCharArray());
    	System.out.println(Long.toHexString(crc));
     
    }

    Methode 2 (dite "Fast"):
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    // the precomputed values for all possible byte values
    private static long[] CRC64Table = new long[256];
     
    // precompute the CRC-64 table for one byte
    static {
    	// x64 + x4 + x3 + x1 + 1
    	long POLY64        = 0x000000000000001BL;
    	long POLY64Reverse = 0xd800000000000000L;
     
    	long reminder;
    	for(int i=0;i<256;i++) {
    		reminder = i;
    	    for (int j=0;j<8;j++) {
    	    	if ((reminder & 1) !=0)
    	    		reminder = (reminder >>> 1) ^ POLY64Reverse;
    	    	else
    	    		reminder = reminder >>> 1;
    	    }
    	    CRC64Table[i] = reminder;		
    	}
    }
     
    public static long crc64_fast(char[] sequence) {
    	long crc = 0;
    	for(int i=0;i<sequence.length;i++) {
    		int index = (int) ((crc ^ sequence[i]) & 0xff);
    		crc = CRC64Table[index] ^ (crc >>> 8);
    	}
    	return crc;
    }
     
    public static void main(String[] args) {
    	long crc = 0;
    	String s = "123456789"; // CRC64 = 46A5A9388A5BEFFE
     
    	crc = crc64_fast(s.toCharArray());
    	System.out.println(Long.toHexString(crc));
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  2. #2
    Nouveau membre du Club
    Inscrit en
    octobre 2007
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : octobre 2007
    Messages : 80
    Points : 37
    Points
    37

    Par défaut

    BRAVO et Un GRAND Merci pseudocode pour ce code CheckSum 64 Bits qui nous sera trés utile .

    J'ai juste pas compris le role des opérateurs : reminder >>> et leurs significations ?

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    décembre 2006
    Messages
    10 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2006
    Messages : 10 027
    Points : 15 578
    Points
    15 578

    Par défaut

    Citation Envoyé par Fred.77 Voir le message
    J'ai juste pas compris le role des opérateurs : reminder >>> et leurs significations ?
    Ah oui... j'aurais du le signaler:

    reminder est un type "long" de Java. Il est signé car les "unsigned" n'existent pas en Java. L'operateur ">>>" est un décalage de bits à droite qui décale tous les bits, meme le bit de "signe".

    En C, il suffit d'utiliser directement les "unsigned long" et l'operateur ">>":

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned long remaider = 0;
    reminder = (reminder >> 1);
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Calcul d'un CRC 16 bits
    Par pinto_armindo dans le forum Programmation et administration système
    Réponses: 5
    Dernier message: 22/06/2006, 15h35
  2. calcul du CRC sur 2 octets
    Par jeannot27 dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/12/2005, 10h55
  3. [SRC] Calcul de CRC
    Par cfdev dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/03/2005, 13h08
  4. Cherche l'algo crc 16 bits
    Par icepower dans le forum Général Algorithmique
    Réponses: 2
    Dernier message: 21/08/2002, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo