Hello,
J'ai la fonction suivante :
Je n'arrive pas à trouver ce que font les opérateurs : et ? dans cette ligne. Concrêtement que réalise ?poly:0 ( Est-ce que poly vaut 0 ? )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 function crc64($string) { $poly = (0xC96C5795 << 32) | 0xD7870F42; $crc = 0; for ( $i=0 ; $i<strlen($string) ; $i++ ) { $byte = ord($string[$i]); // valeur ASCII du caractère for( $bit=0 ; $bit<8 ; $bit++, $byte>>=1 $byte=$byte/2 ) { $crc = (( $crc>>1 )& ~( 1<<63 )) ^ ((( $crc ^ $byte )&1 )?poly:0 ); } } return $crc; }
J'ai transformé certaines opérations pour que ça soit un peu plus lisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $crc = (( $crc>>1 )& ~( 1<<63 )) ^ ((( $crc ^ $byte )&1 )?poly:0 );
Il s'agit d'une énigme à résoudre en réalité et j'ai besoin de connaitre les entrées qui vont générer un certain CRC.
En principe, j'ai une matrice de 20*20 qui contient des valeurs hexa représentées sur 1 octet.
L'entrée de la matrice est M(1,1) et la sortie M(20,20), il s'agit juste de signalisation.
Le but étant de trouver la ou les chaines d'octets partant de l'entrée de la matrice et arrivant à la sortie ( en concaténant chaque octet traversé pour atteindre la sortie ) dont le CRC vaut 0x4242424242424242.
La méthode naïve voudrait que je calcule toutes les CRC pour trouver l'entrée qui correspond et ne plus avoir qu'à la chercher dans la matrice. ( Probablement très long ). Ou arrêter le calcul du CRC dès qu'il diffère du résultat attendu et passer au suivant.
A savoir que j'ai 5 secondes entre le moment où la matrice est générée et le moment où je dois envoyer la réponse.
Je trouve étonnant que le polynôme générateur vaille 1*x^0 = 1 mais je suppose que c'est pour nous faciliter la tâche.
Avant de m'y atteler, je voulais comprendre un peu ce qu'il se passait là dedans.
Je vais probablement recoder ceci en C.
Merci d'avance. Cordialement.
Code : 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 function crc64($string) $poly = (0xC96C5795 << 32) | 0xD7870F42 $poly = 1; $crc = 0; for ( $i=0 ; $i<strlen($string) ; $i++ ) { $byte = ord($string[$i]); // valeur ASCII du caractère for( $bit=0 ; $bit<8 ; $bit++, $byte>>=1 ) for( $bit=0 ; $bit<8 ; $bit++, $byte=ENT($byte/2) ) { $crc = (( $crc>>1 )& ~( 1<<63 )) ^ ((( $crc ^ $byte )&1 )?poly:0 ); $crc = ( ENT($crc/2) & 0x0FFFFFFF ) ^ ((( $crc ^ $byte )&1 )?poly:0 ); } return $crc; }
Partager