本帖最后由 oelenson 于 2014-06-21 12:49:27 编辑

解决方案 »

  1.   

    java 的 >>> (左补0右移) 在 php 中不需特殊处理,可直接 >>
    至多将 (crc >>> 8) 译为 (($crc >> 8) & 0xff) java 的 byte[] 类型,没有对应的 php 数据类型
    你可以逐字节取内码 ord($buffer[$i]) 
    也可以一进函数就 $buffer = array_values(unpack('C', $buffer));
    unpack('C', $buffer) 返回的数组是从下标 1 开始的,所以要 array_values 整理一下
    如果用 foreach 循环,或 for 循环从 1 开始就不需要整理了其他应该没什么了如果觉得还有问题,请给出 java 运行的几组结果
      

  2.   


    $str2='AQEBAQEB';
    $str2=base64_decode($str2); 
    java 得到的 结果是 8357
    php 得到的结果是 33653
    <?php
    function crc16($buffer) {
    $crc = 0xffff;
    //$buffer = array_values(unpack('C', $buffer)); for ($i = 0; $i < strlen($buffer); $i++) {
    $crc = ((($crc >> 8) & 0xff)  | ($crc << 8)) & 0xffff;
    $crc ^= (ord($buffer[$i]) & 0xff);
    $crc ^= (($crc & 0xff) >> 4);
    $crc ^= ($crc << 12) & 0xffff;
    $crc ^= (($crc & 0xff) << 5) & 0xffff;
    }
    $crc &= 0xffff; return $crc;
    }
    $str=base64_decode('AQEBAQEBdYM=');
    $str2='AQEBAQEB';
    $str2=base64_decode($str2);
    $arr2=unpack('H*',$str2);
    $arr=unpack('H*',$str);
    print_r($arr);
    echo '-----------------------------------';
    echo crc16($str2);
      

  3.   

    为什么要 $str2=base64_decode($str2); 
    java 里也做了 base64 编码了吗?让你多给几组,为何只给一组呢?