【问题标题】:CRC8-Check in PHPPHP中的CRC8检查
【发布时间】:2010-10-05 03:45:17
【问题描述】:

如何在 PHP 中生成 CRC-8 校验和?

【问题讨论】:

标签: php checksum crc


【解决方案1】:

必须是 CRC8 吗?

在 PHP.net 上有一个非常简单的 CRC16 实现和一个原生版本的 CRC32

如果它必须是 CRC8,我建议从 Marius 指出的维基百科页面上的伪代码中编写一些内容。

【讨论】:

    【解决方案2】:
    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;
    }
    

    要将此函数用于二进制字符串,您必须先将二进制字符串转换为数组。可以这样实现:

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

    示例如何使用整个东西:

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

    【讨论】:

    • Bob,您的代码不适用于“D$1I 11/14/2006 18:15:00 1634146 3772376 3772344 3772312 3772294 1*”字符串。根据您的计算,该示例的 crc8 计算结果为 28,而它应该给出 57。我希望您仍在关注此线程。请你看看这个好吗?
    • 我认为 Bob 刚刚获得了他的代码 from Pastebin 甚至没有添加引用,所以我怀疑它会被修复。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2021-12-19
    • 1970-01-01
    • 2014-08-18
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多