[RESOLU] CRC

Avatar du membre
Mammouth du PHP | 1609 Messages

20 juil. 2020, 17:11

Moué ben ces histoires d'hexadécimale et compagnie c'est pas si simple. J'ai fait quelques tests et je dois bien avouer que quelque chose m'échappe dans tout ça.

De base je dirai que si le code hexadécimale de la décimale 10 est a alors ce devrait être égale à "\xa" dont le code hexadécimale est a mais ça n'est pas le cas. Il doit y avoir une petite subtilité (la représentation hexadécimale retournée par dechex n'est peut être pas la même que celle utilisée avec la syntaxe \xhh ?)... et faudrait un peu (trop) de temps pour comprendre.

Je serais curieux d'avoir les explications de quelqu'un qui maîtrise bien tout ça. ^^
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 17:13

J'aurais pas du mettre ça dans PHP débutant :non: :mrgreen:

Ca se trouve qu'il y a un bug dans PHP et ça fausse le résultat

Avatar du membre
Mammouth du PHP | 1609 Messages

20 juil. 2020, 17:19

Bah en tout cas pour contourner le problème tu peux faire un truc comme ça, je pense que ça devrait fonctionner dans tous les cas :
eval('$value = "\x'.dechex(10).'";');
hash('crc32c', $value);
Ainsi $value sera bien évalué comme "\xa" et le hash devrait correspondre.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 19:04

Bah en tout cas pour contourner le problème tu peux faire un truc comme ça, je pense que ça devrait fonctionner dans tous les cas :
eval('$value = "\x'.dechex(10).'";');
hash('crc32c', $value);
Ainsi $value sera bien évalué comme "\xa" et le hash devrait correspondre.
Un gros bordel mais ça marche!
Merci à toi

Code : Tout sélectionner

$out2 = array(); $out2[0] = ''; $out2[1] = ''; $ven2 = preg_replace($get, $out, $venname); $dev2 = preg_replace($get, $out, $devname); $filtre = preg_replace($patterns, $replacements, $str); $division = strlen($filtre) / 2; $strven = "0x0A, 0x01, " .$venname. "0x00"; $venlen = preg_replace($patterns, $replacements, $strven); $vendiv = strlen($venlen) / 2; // byte lentgh $strdev = "0x0A, 0x01, " .$devname. "0x00"; $devlen = preg_replace($patterns, $replacements, $strdev); $devdiv = strlen($devlen) / 2; // byte lentgh eval('$value = "\x01\x'.dechex("$division").'\x00\x01\x00\x0D\x00\x01\x00\x08\x81\x8'.$TBBID.'\x02\x8'.$TBBID.'\x00\x00\x00\x08\x82\x9'.$TBBID.'\x01\x8'.$TBBID.'\x00\x00\x00\x08\x83\x8'.$TBBID.'\x04\x8'.$TBBID.'\x01\x00\x00\x08\x84\x9'.$TBBID.'\x03\x8'.$TBBID.'\x01\x00\x00\x05\x85\x50\x00\x00\x05\x86\x50\x00\x00\x02\x87\x0B\x88\x20\x01\x00\x64\x00\x00\x00\x00\x00\x03\x89\x80\x05\x8A\x50\x40\x00\x05\x8B\x50\x40\x00\x'.dechex("$vendiv").'\x01'.$ven2.'\x00\x'.dechex("$devdiv").'\x02'.$dev2.'\x00";'); echo hash('crc32c', $value); $bytB = "0x0". "$byt2$byt3$byt4$byt5$byt6$byt7$byt8$byt9"; echo "<br> Thunderbolt BUS ID: $TBBID"; ?>