2009-02-03 6 views

Répondre

0

Est-ce que ce doit être CRC8?

Sur PHP.net, il existe une implémentation très simple de CRC16 et une version native de CRC32.

Si cela doit être CRC8, je recommanderais de coder quelque chose du code sudo sur la page wikipedia Marius a souligné.

0
function crcnifull ($dato, $byte) 
{ 
    static $PolyFull=0x8c; 

    for ($i=0; $i<8; $i++) 
    { 
    $x=$byte&1; 
    $byte>>=1; 
    if ($dato&1) $byte|=0x80; 
    if ($x) $byte^=$PolyFull; 
    $dato>>=1; 
    } 
    return $byte; 
} 

function crc8 (array $ar,$n=false) 
{ 
    if ($n===false) $n=count($ar); 
    $crcbyte=0; 
    for ($i=0; $i<$n; $i++) $crcbyte=crcnifull($ar[$i], $crcbyte); 
    return $crcbyte; 
} 

Pour utiliser cette fonction pour une chaîne binaire, vous devez d'abord convertir la chaîne binaire en tableau. Cela peut être réalisé comme ceci:

function sbin2ar($sbin) 
{ 
    $ar=array(); 
    $ll=strlen($sbin); 
    for ($i=0; $i<$ll; $i++) $ar[]=ord(substr($sbin,$i,1)); 
    return $ar; 
} 

Exemple comment utiliser la chose:

$crc8=crc8(sbin2ar($packet)); 
+0

Bob, votre code ne fonctionne pas pour le « D $ 1I 11/14/2006 18:15: 00 1634146 3772376 3772344 3772312 3772294 1 * "chaîne. Après vos calculs, les calculs de crc8 pour cet exemple donnent comme résultat 28, quand il devrait donner 57. J'espère que vous suivez toujours ce fil. Pouvez-vous vérifier cela, s'il vous plaît? –

+0

Je pense que Bob vient d'obtenir son code [de Pastebin] (http://pastebin.com/qypDLF5W) sans même ajouter de référence, donc je doute qu'il soit corrigé. – GolezTrol