За последние 24 часа нас посетили 17062 программиста и 1835 роботов. Сейчас ищут 1663 программиста ...

crc 16

Тема в разделе "Прочие вопросы по PHP", создана пользователем Roker, 29 апр 2009.

  1. Roker

    Roker Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    54
    Симпатии:
    0
  2. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
  3. Roker

    Roker Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    54
    Симпатии:
    0
    не уж то нет готовых решений. Напряжно как то понят эти сдвиги и тп.
     
  4. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Думать действительно напряжно.

    Если не хочешь разбираться, обратись в фриланс, там тебе помогут, за соответствующее вознаграждение, естественно.
     
  5. Roker

    Roker Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    54
    Симпатии:
    0
    Вот исходник на С с wiki
    Код (Text):
    1. unsigned short Crc16( unsigned char *pcBlock, unsigned short len )
    2. {
    3.     unsigned short crc = 0xFFFF;
    4.     unsigned char i;
    5.  
    6.     while( len-- )
    7.     {
    8.         crc ^= *pcBlock++ << 8;
    9.  
    10.         for( i = 0; i < 8; i++ )
    11.         crc = crc & 0x8000 ? ( crc << 1 ) ^ 0x1021 : crc << 1;
    12.     }
    13.  
    14.     return crc;
    15. }
    вот что у меня получилось. Но что то не то.

    PHP:
    1.  
    2. <?
    3. function crc16( $str){
    4.     $crc = 0xFFFF;
    5.     $x=0;
    6.     $len = strlen($str);
    7.     while($x<$len) {
    8.         $crc ^= $str[$x] << 8;
    9.          for( $i = 0; $i < 8;$i++ ){
    10.             $crc = $crc & 0x8000 ? ( $crc << 1 ) ^ 0x1021 : $crc << 1;
    11.             echo "$crc\n";
    12.         }
    13.         $x++;
    14.     }
    15.      return $crc;
    16. }
    17. echo "CHECK: ".crc16(123);
    18.  
     
  6. dimonomid

    dimonomid Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    1
    Симпатии:
    0
    Roker, ты ord() забыл, и еще забыл то, что переменная crc имеет тип "unsigned int", то есть может принимать значения от 0 до 0xffff. В php нужно обрезать ее по этой маске.

    Вот рабочая функция.

    PHP:
    1. function crc16($sStr, $aParams = array()){
    2.  
    3.    //-- устанавливаем значения по умолчанию у незаданных параметров
    4.    $aDefaults = array(
    5.       "polynome" => 0x1021,
    6.       "init" => 0xFFFF,
    7.       "xor_out" => 0,
    8.    );
    9.  
    10.    foreach ($aDefaults as $key => $val){
    11.       if (!isset($aParams[$key])){
    12.          $aParams[$key] = $val;
    13.       }
    14.    }
    15.  
    16.    //-- инициализируем переменные
    17.    $sStr .= "";
    18.    $crc = $aParams['init'];
    19.    $len = strlen($sStr);
    20.    $i = 0;
    21.  
    22.    //-- считаем
    23.    while ($len--){
    24.       $crc ^= ord($sStr[$i++]) << 8;
    25.       $crc &= 0xffff;
    26.  
    27.       for ($j = 0; $j < 8; $j++){
    28.          $crc = ($crc & 0x8000) ? ($crc << 1) ^ $aParams['polynome'] : $crc << 1;
    29.          $crc &= 0xffff;
    30.       }
    31.    }
    32.  
    33.    $crc ^= $aParams['xor_out'];
    34.  
    35.    return $crc;
    36. }