[RESOLU] CRC

Eléphanteau du PHP | 40 Messages

15 juil. 2020, 14:21

Bonjour,
Je suis débutant en PHP
j'aimerais savoir comment utiliser https://github.com/meetanthony/crcphp (calculer les checksum CRC8 et CRC32c) dans mon propre projet.
Je ne m'y connais absolument pas en class public function etc.
Merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

15 juil. 2020, 15:32

Le mieux c'est que tu contactes l'auteur de cette librairie.
Mais utiliser une lib qui n'est pas du tout documentée en étant débutant, c'est une très très mauvaise idée.


Essaye de voir si tu ne peux pas utiliser une autre librairie qui serait + adaptée à ton niveau :
https://github.com/search?l=PHP&q=crc&type=Repositories

Google a par exemple une librairie avec un minimum de doc et un exemple de comment l'utiliser :
https://github.com/google/php-crc32
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 40 Messages

15 juil. 2020, 16:14

Le mieux c'est que tu contactes l'auteur de cette librairie.
Mais utiliser une lib qui n'est pas du tout documentée en étant débutant, c'est une très très mauvaise idée.

Essaye de voir si tu ne peux pas utiliser une autre librairie qui serait + adaptée à ton niveau :
https://github.com/search?l=PHP&q=crc&type=Repositories

Google a par exemple une librairie avec un minimum de doc et un exemple de comment l'utiliser :
https://github.com/google/php-crc32
Merci pour ta réponse, ça fait 3 semaines que je cherche et c'est lui qui propose ce dont j'ai besoin, j'ai donc vraiment besoin de savoir utiliser sa librairie à lui.
J'ai essayé de le contacter mais impossible.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

16 juil. 2020, 14:06

Oui mais si ce qu'il propose tu ne sais pas le faire fonctionner, c'est comme si il ne te le proposais pas.


Si tu as juste besoin de CRC8 et de CRC32c, regarde celle là :
https://github.com/pburggraf/CRC
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 12:32

Bonjour merci pour ton aide,
j'ai vu que crc32c est supporté nativement depuis php7 via hash('crc32c', $data)

du coup j'ai essayé et trouvé une solution pour faire un hash sur des bytes mais je suis face à un problème quand je veux faire fonctionner dechex à l'intérieur de hash, le résultat affiché n'est pas du tout correct, voici mon code:

Code : Tout sélectionner

<?php $brut = "\xa"; // le hash de ça est correct c'est a dire 399F7B69 $premiere = '"\x'. dechex(10) .'"'; // affiche dd36db2f qui est incorrect $deuxieme = "\x". dechex(10); // affiche c0ccc3a8 donc incorrect echo hash('crc32c',$deuxieme, false); echo "<br> $premiere"; echo "<br> $deuxieme"; ?>

dechex(10) = a
Modifié en dernier par 11inq le 20 juil. 2020, 19:41, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

20 juil. 2020, 13:33

Salut, quand tu utilises \x dans une chaine entre double quotes (") c'est pour déclarer un caractère en hexadécimal \xhh de code hh comme tu peux le voir ici :
https://www.php.net/manual/fr/regexp.re ... escape.php

Par exemple le a en hexadécimal donne 61 et echo "\x61" affiche bien un a (mais echo '\x61' affiche \x61).

Donc "\xa" c'est à priori un code hexadécimal incomplet, je ne saurai dire exactement comment c'est traité. Tu obtiens le hash de la conversion de \xa.
'"\xa"' ici l'hexadécimal est carrément ignoré la chaine étant entourée de simple quotes. Tu obtiens donc le hash de "\xa" et non de \xa.
Et pour finir "\x".'a' est interprété comme '\xa' le "\x" entre double quotes ne subissant apparemment aucune transformation. Tu obtiens donc le hash de \xa (et non de sa conversion).

Tu obtiens donc logiquement 3 résultats différents.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 13:37

d'accord merci, mais est ce qu'il y a une possibilité d'utiliser dechex() à l'intérieur de hash() et avoir un résultat correct?

Avatar du membre
Mammouth du PHP | 1609 Messages

20 juil. 2020, 13:50

Et bien je ne sais pas, ce que tu essaies de faire semble ne pas avoir de sens. Pourquoi cherches tu à hasher une chaine \x + dechex(10) ? \xa c'est sensé représenter quoi comme caractère ? quel intérêt d'utiliser dechex(10) au lieu d'utiliser directement le caractère a ? Pourquoi utilises tu \x ?

EDIT tu peux essayer quelque chose dans le genre :
$string = hex2bin('0'.dechex(10));
hash('crc32c', $string);
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 14:30

je suis obligé d'utiliser dechex car sur une autre page l'utilisateur tape un numéro normal en décimal, je le récupère transforme en hex pour faire un checksum

ce petit bout de php s'intègre dans un project beaucoup plus complexe et je suis bloqué à cause de ça

une partie du code:

Code : Tout sélectionner

$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 $div2 = dechex($division); $vendiv2 = dechex($vendiv); $devidiv2 = dechex($devdiv); // il faut des guillmets " " pour que la valeur soit correctement affiché à la sortie, les 0x0 des dechex peuvent poser problème. $inputhex = "\x01\x$div2\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\x0$vendiv2\x01$ven2\x00\x$devidiv2\x02$dev2\x00"; $bytB = "0x0". "$byt2$byt3$byt4$byt5$byt6$byt7$byt8$byt9"; echo $inputhex . "<br>"; echo hash('crc32c', $inputhex, false); ?> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <br>



peut être que dans ce code mon script n'est pas à jour mais en tout cas dans une version orignal tout fonctionne comme je souhaite sauf quand j'intègre dechex()

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 14:37

Pourquoi utilises tu \x ?
parce que c'est la méthode qui permet que le checksum soit traité en tant que hex, sinon c'est un string normal donc pas bon pour mon cas

Avatar du membre
Mammouth du PHP | 1609 Messages

20 juil. 2020, 14:44

J'ai édité mon précédent commentaire, une solution qui fonctionne pour \xa :
$string = hex2bin('0'.dechex(10));
hash('crc32c', $string);
à tester pas sur que ce soit 100% fiable.

EDIT : bien ce que je pensais, ce n'est pas fiable, ça fonctionne juste dans le cas particulier présenté.

En fait pour moi le problème c'est que \xa n'est pas un code hexadécimal, il est incomplet.
Donc je sais pas si ça résout vraiment ton problème mais il suffit dans ce cas que tu n'utilises pas les double quotes sur la valeur de départ, ainsi tu obtiendras bien le même hash :
$string = '\xa';
hash('crc32c', $string);

$string = '\x'.dechex(10);
hash('crc32c', $string);
Modifié en dernier par Saian le 20 juil. 2020, 15:53, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 15:52

Merci ça semble fonctionner merci mais quand je "echo $string1" ou $string2 je ne vois aucun résultat du coup je sais pas comment il est interprété et du coup comment faire le hash en mélangeant plusieurs donnés. Si tu as une idée stp.

Code : Tout sélectionner

<?php echo dechex(10) . "<br>"; // = a echo dechex(11) . "<br>"; // = b $string1 = hex2bin('0'.dechex(10)); $string2 = hex2bin('0'.dechex(11)); $string3 = "\xa"; echo hash('crc32c', "\xa"); // = 399f7b69 = ok echo hash('crc32c', "xa"); // = 4081708c = incorrect echo hash('crc32c', $string1); // ok echo hash('crc32c', $string2); // ok echo hash('crc32c', $string3); // ok ?>


et tu peux m'expliquer à quoi sert le '0' de hex2bin('0'.dechex(10));
à quoi correspond


hex2bin pour convertir en binaire mais quand je hash directement la valeur binaire le résultat est incorrect
hex2bin('0'.dechex(10)); // = 1010
echo hash('crc32c', "1010"); // = 598a0112 = pas bon
Modifié en dernier par 11inq le 20 juil. 2020, 16:08, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

20 juil. 2020, 16:07

J'ai encore édité mon commentaire précédent. Le 0 c'est pas bon. C'est juste qu'en faisant une conversion bin2hex("\xa") tu obtiens 0a et donc en faisant un hex2bin('0a') tu obtiens bien la même chaine qu'avec "\xa". Mais ça fonctionne dans ce cas particulier seulement.

Pour moi le problème est que tu compares des choses différentes. Je sais pas si ça résout vraiment ton problème mais il suffit dans ce cas que tu n'utilises pas les double quotes sur la valeur de départ, ainsi tu obtiendras bien le même hash :
$string = '\xa';// \xa
hash('crc32c', $string);

$string = '\x'.dechex(10);// \xa
hash('crc32c', $string);
dechex(10) = a = \x61 qui est différent de \xa...

En revanche ce code est bon :
$string = "\x61";// a
hash('crc32c', $string);

$string = dechex(10);// a
hash('crc32c', $string);

Bref, tu ne peux comparer que ce qui est comparable et tout cela est très confus.

PS : et théoriquement étant donné que tu utilises une conversion dechex, la sortie de la fonction est donc sensée être hexadécimal et tu ne devrais donc pas ajouter de \x devant pour la convertir en hexa puisqu'elle est déjà hexa.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 16:21

J'ai encore édité mon commentaire précédent. Le 0 c'est pas bon. C'est juste qu'en faisant une conversion bin2hex("\xa") tu obtiens 0a et donc en faisant un hex2bin('0a') tu obtiens bien la même chaine qu'avec "\xa". Mais ça fonctionne dans ce cas particulier seulement.

Pour moi le problème est que tu compares des choses différentes. Je sais pas si ça résout vraiment ton problème mais il suffit dans ce cas que tu n'utilises pas les double quotes sur la valeur de départ, ainsi tu obtiendras bien le même hash :
$string = '\xa';// \xa
hash('crc32c', $string);

$string = '\x'.dechex(10);// \xa
hash('crc32c', $string);
dechex(10) = a = \x61 qui est différent de \xa...

En revanche ce code est bon :
$string = "\x61";// a
hash('crc32c', $string);

$string = dechex(10);// a
hash('crc32c', $string);

Bref, tu ne peux comparer que ce qui est comparable et tout cela est très confus.

PS : et théoriquement étant donné que tu utilises une conversion dechex, la sortie de la fonction est donc sensée être hexadécimal et tu ne devrais donc pas ajouter de \x devant pour la convertir en hexa puisqu'elle est déjà hexa.
voici ce que ça donne:

Code : Tout sélectionner

<?php // resultat correct 399F7B69 $string = '\x'.dechex(10);// \xa echo hash('crc32c', $string); // = c0ccc3a8 = pas bon $string2 = dechex(10);// a echo "<br>" . hash('crc32c', $string2); // = c1d04330 $string3 = "\x61";// a echo "<br>" . hash('crc32c', $string3); // = c1d04330 $string4 = dechex(10);// a echo "<br>" . hash('crc32c', $string4); // = c1d04330 ?>

Eléphanteau du PHP | 40 Messages

20 juil. 2020, 16:27

Le problème c'est que hash(crc32c) interprète et fait le hash des hex seulement si elle est présentée "\xVALEURHEX1\xVALEURHEX2" etc.