Page 1 sur 2

CRC

Posté : 15 juil. 2020, 14:21
par 11inq
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.

Re: CRC

Posté : 15 juil. 2020, 15:32
par @rthur
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

Re: CRC

Posté : 15 juil. 2020, 16:14
par 11inq
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.

Re: CRC

Posté : 16 juil. 2020, 14:06
par @rthur
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

Re: CRC

Posté : 20 juil. 2020, 12:32
par 11inq
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

Re: CRC

Posté : 20 juil. 2020, 13:33
par Saian
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.

Re: CRC

Posté : 20 juil. 2020, 13:37
par 11inq
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?

Re: CRC

Posté : 20 juil. 2020, 13:50
par Saian
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);

Re: CRC

Posté : 20 juil. 2020, 14:30
par 11inq
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()

Re: CRC

Posté : 20 juil. 2020, 14:37
par 11inq
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

Re: CRC

Posté : 20 juil. 2020, 14:44
par Saian
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);

Re: CRC

Posté : 20 juil. 2020, 15:52
par 11inq
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

Re: CRC

Posté : 20 juil. 2020, 16:07
par Saian
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.

Re: CRC

Posté : 20 juil. 2020, 16:21
par 11inq
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 ?>

Re: CRC

Posté : 20 juil. 2020, 16:27
par 11inq
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.