2014-04-14 42 views
2

擴大,並給予解釋,即也可以去上面貼的鏈接,這裏是一個PHP函數得到一個CRC16校驗字符串數據:定製CRC16有位反射

function crc16($data) { 
     $crc = 0xAC6F; 
     $len = strlen($data); 
     $i = 0; 
     while ($len--) { 
      $crc ^= reversebyte(ord($data[$i++])) << 8; 
      $crc &= 0xffff; 
      for ($j = 0; $j < 8; $j++){ 
       $crc = ($crc & 0x8000) ? ($crc << 1)^0x8005 : $crc << 1; 
       $crc &= 0xffff; 
      } 
     } 
     $crc ^= 0x0000; 
     $crc = reversebits($crc); 
     return $crc; 
    } 

    function reversebyte($byte) { 
     $ob = 0; 
     $b = (1 << 7); 
     for ($i = 0; $i <= 7; $i++) { 
      if (($byte & $b) !== 0) { 
       $ob |= (1 << $i); 
      } 
      $b >>= 1; 
     } 
     return $ob; 
    } 

    function reversebits($cc) { 
     $ob = 0; 
     $b = (1 << 15); 
     for ($i = 0; $i <= 15; $i++) { 
      if (($cc & $b) !== 0) { 
       $ob |= (1 << $i); 
      } 
      $b >>= 1; 
     } 
     return $ob; 
    } 

    Poly = 0x8005 
    Init = 0xAC6F 
    Xor = 0x0000 
    Refin = True 
    Refout = True 

如果你不這樣做要添加反射,然後替換功能CRC16)這些行(:

更換REFIN = TRUE:

$crc ^= reversebyte(ord($data[$i++])) << 8; 

隨着REFIN =假:

$crc ^= ord($data[$i++]) << 8; 

更換REFOUT = TRUE:

$crc = reversebits($crc); 

與REFOUT =假(刪除該整行):

$crc = reversebits($crc); //remove me 
+3

由於您沒有努力自己解決問題 - 您的預算是多少? – h2ooooooo

+0

你有任何例子他們應該輸出,如果他們校驗和正確?如果是這樣,請將其添加到OP中。 ('foo'給出'xxx','bar'給出'yyy') – h2ooooooo

+0

你還可以查看哪些設置會給出正確的結果嗎? http://www.zorc.breitbandkatze.de/crc.html據我所知,根據你所說的,他們都不應該給出正確的結果。 – h2ooooooo

回答