当前位置: 首页 > article >正文

android 计算CRC

<?php
/**
 * 将一个字符按比特位进行反转 eg: 65 (01000001) --> 130(10000010)
 * @param $char
 * @return $char
 */
function reverseChar($char) {
    $byte = ord($char);
    $tmp = 0;
    for ($i = 0; $i < 8; ++$i) {
        if ($byte & (1 << $i)) {
            $tmp |= (1 << (7 - $i));
        }
    }
    return chr($tmp);
}
 
/**
 * 将一个字节流按比特位反转 eg: 'AB'(01000001 01000010)  --> '\x42\x82'(01000010 10000010)
 * @param $str
 */
function reverseString($str) {
    $m = 0;
    $n = strlen($str) - 1;
    while ($m <= $n) {
        if ($m == $n) {
            $str{$m} = reverseChar($str{$m});
            break;
        }
        $ord1 = reverseChar($str{$m});
        $ord2 = reverseChar($str{$n});
        $str{$m} = $ord2;
        $str{$n} = $ord1;
        $m++;
        $n--;
    }
    return $str;
}
 
/**
 * @param string $str 待校验字符串
 * @param int $polynomial 二项式
 * @param int $initValue 初始值
 * @param int $xOrValue 输出结果前异或的值
 * @param bool $inputReverse 输入字符串是否每个字节按比特位反转
 * @param bool $outputReverse 输出是否整体按比特位反转
 * @return int
 */
function crc16($str, $polynomial, $initValue, $xOrValue, $inputReverse = false, $outputReverse = false) {
    $crc = $initValue;
 
    for ($i = 0; $i < strlen($str); $i++) {
        if ($inputReverse) {
            // 输入数据每个字节按比特位逆转
            $c = ord(reverseChar($str{$i}));
        } else {
            $c = ord($str{$i});
        }
        $crc ^= ($c << 8);
        for ($j = 0; $j < 8; ++$j) {
            if ($crc & 0x8000) {
                $crc = (($crc << 1) & 0xffff) ^ $polynomial;
            } else {
                $crc = ($crc << 1) & 0xffff;
            }
        }
    }
    if ($outputReverse) {
        // 把低地址存低位,即采用小端法将整数转换为字符串
        $ret = pack('cc', $crc & 0xff, ($crc >> 8) & 0xff);
        // 输出结果按比特位逆转整个字符串
        $ret = reverseString($ret);
        // 再把结果按小端法重新转换成整数
        $arr = unpack('vshort', $ret);
        $crc = $arr['short'];
    }
    return $crc ^ $xOrValue;
}
 
printf("%x\n", crc16('1234567890', 0x8005, 0, 0, true, true));
//0A 09 02 01 03
printf("%x\n", crc16('0A 09 02 01 03', 0x8005, 0, 0, true, true));
printf("%x\n", crc16('0A09020103', 0x8005, 0, 0, true, true));
echo "<br>";
printf("%x\n", crc16('0A 09 02 01 03', 0x8005, 0xffff, 0, true, true));
printf("%x\n", crc16('0A09020103', 0x8005, 0xffff, 0, true, true));
echo "<br>";
/* 列举一些常用的crc16算法 */
 
// CRC-16/IBM
printf("%x\n", crc16('0A 09 02 01 03', 0x8005, 0, 0, true, true));
 
// CRC-16/MAXIM
printf("%x\n", crc16('0A 09 02 01 03', 0x8005, 0, 0xffff, true, true));
 
// CRC-16/USB
printf("%x\n", crc16('0A 09 02 01 03', 0x8005, 0xffff, 0xffff, true, true));
 
// CRC-16/MODBUS
printf("%x\n", crc16('0A 09 02 01 03', 0x8005, 0xffff, 0, true, true));
 
// CRC-16/CCITT
printf("%x\n", crc16('0A 09 02 01 03', 0x1021, 0, 0, true, true));
 
// CRC-16/CCITT-FALSE
printf("%x\n", crc16('0A 09 02 01 03', 0x1021, 0xffff, 0, false, false));
 
// CRC-16/X25
printf("%x\n", crc16('0A 09 02 01 03', 0x1021, 0xffff, 0xffff, true, true));
 
// CRC-16/XMODEM
printf("%x\n", crc16('0A 09 02 01 03', 0x1021, 0, 0, false, false));
 
// CRC-16/DNP
printf("%x\n", crc16('0A 09 02 01 03', 0x3d65, 0, 0xffff, true, true));

echo "<br>0A09020103<br>";
// CRC-16/IBM
printf("%x\n", crc16('0A09020103', 0x8005, 0, 0, true, true));
 
// CRC-16/MAXIM
printf("%x\n", crc16('0A09020103', 0x8005, 0, 0xffff, true, true));
 
// CRC-16/USB
printf("%x\n", crc16('0A09020103', 0x8005, 0xffff, 0xffff, true, true));
 
// CRC-16/MODBUS
printf("%x\n", crc16('0A09020103', 0x8005, 0xffff, 0, true, true));
 
// CRC-16/CCITT
printf("%x\n", crc16('0A09020103', 0x1021, 0, 0, true, true));
 
// CRC-16/CCITT-FALSE
printf("%x\n", crc16('0A09020103', 0x1021, 0xffff, 0, false, false));
 
// CRC-16/X25
printf("%x\n", crc16('0A 09 02 01 03', 0x1021, 0xffff, 0xffff, true, true));
 
// CRC-16/XMODEM
printf("%x\n", crc16('0A09020103', 0x1021, 0, 0, false, false));
 
// CRC-16/DNP
printf("%x\n", crc16('0A09020103', 0x3d65, 0, 0xffff, true, true));

$crc_table = array(
    0x0,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
        0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
        0x1231,  0x210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
        0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
        0x2462,  0x3443,  0x420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
        0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
        0x3653,  0x2672,  0x1611,  0x630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
        0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
        0x48c4,  0x58e5,  0x6886,  0x78a7,  0x840,  0x1861,  0x2802,  0x3823,
        0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
        0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0xa50,  0x3a33,  0x2a12,
        0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
        0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0xc60,  0x1c41,
        0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
        0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0xe70,
        0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
        0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
        0x1080,  0xa1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
        0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
        0x2b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
        0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
        0x34e2,  0x24c3,  0x14a0,  0x481,  0x7466,  0x6447,  0x5424,  0x4405,
        0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
        0x26d3,  0x36f2,  0x691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
        0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
        0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x8e1,  0x3882,  0x28a3,
        0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
        0x4a75,  0x5a54,  0x6a37,  0x7a16,  0xaf1,  0x1ad0,  0x2ab3,  0x3a92,
        0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
        0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0xcc1,
        0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
        0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0xed1,  0x1ef0);
//0A09020103
function genCRC (&$ptr)
{
    $crc = 0x0000;
    $crc_table = $GLOBALS['crc_table'];
    for ($i = 0; $i < strlen($ptr); $i++)
        $crc =  $crc_table[(($crc>>8) ^ ord($ptr[$i]))] ^ (($crc<<8) & 0x00FFFF);
    return $crc;
}

    function  crc162( $string ) {
       $crc  = 0xFFFF;
       for  ( $x  = 0;  $x  <  strlen  ( $string );  $x ++) {
         $crc  =  $crc  ^ ord( $string [ $x ]);
         for  ( $y  = 0;  $y  < 8;  $y ++) {
           if  (( $crc  & 0x0001) == 0x0001) {
             $crc  = (( $crc  >> 1) ^ 0xA001);
           }  else  {  $crc  =  $crc  >> 1; }
         }
       }
       return  $crc ;
}
    $test = chr(0x0A).chr(0x09).chr(0x02).chr(0x01).chr(0x03); // CRC16-CCITT = 0xE2B4
  echo "<BR>".   genCRC ($test);

echo  "<BR>". crc162("0A09020103");


function crc16LSBMSB($data) {
    $crc = 0x0000; // 初始值,对于LSB-MSB模式常见初始值设为0x0000
    $poly = 0xA001; // CRC16(LSB-MSB)对应的多项式

    for ($i = 0; $i < strlen($data); $i++) {
        $crc ^= ord($data[$i]);
        for ($j = 0; $j < 8; $j++) {
            if ($crc & 0x0001) {
                $crc = ($crc >> 1) ^ $poly;
            } else {
                $crc >>= 1;
            }
            $crc &= 0xFFFF; // 确保crc值保持在16位范围内
        }
    }

    return $crc;
}

// 示例用法
$data = "Hello, World!";
$crcValue = crc16LSBMSB($data);
echo "CRC-16(LSB-MSB)值为: ".dechex($crcValue)."\n";

//0A09020103
$data = "0A 09 02 01 03";
$crcValue = crc16LSBMSB($data);
echo "<BR>CRC-16(LSB-MSB)值为: ".dechex($crcValue)."\n";


function crc16MSBLSB($data) {
    $crc = 0xFFFF; // 初始值,CRC-16(MSB-LSB)常用的初始值设定为0xFFFF
    $poly = 0x8005; // CRC-16(MSB-LSB)对应的多项式

    for ($i = 0; $i < strlen($data); $i++) {
        $crc ^= ord($data[$i]) << 8;
        for ($j = 0; $j < 8; $j++) {
            if ($crc & 0x8000) {
                $crc = ($crc << 1) ^ $poly;
            } else {
                $crc <<= 1;
            }
            $crc &= 0xFFFF; // 确保crc值保持在16位范围内
        }
    }

    return $crc;
}
 
$data = "0A 09 02 01 03";
$crcValue = crc16MSBLSB($data);
echo "<BR>33333333333==CRC-16(LSB-MSB)值为: ".dechex($crcValue)."\n";

$data = "0A09020103";
$crcValue = crc16MSBLSB($data);
echo "<BR>33333333333==CRC-16(LSB-MSB)值为: ".dechex($crcValue)."\n";


function hexToByteArray($hexString) {
    $byteArray = [];
    $length = strlen($hexString);
    for ($i = 0; $i < $length; $i += 2) {
        $byteArray[] = hexdec(substr($hexString, $i, 2));
    }
    return $byteArray;
}

function crc16MSBLSB东方($dataArray) {
    $crc = 0xFFFF;
    $poly = 0x8005;

    for ($i = 0; $i < count($dataArray); $i++) {
        $crc ^= $dataArray[$i] << 8;
        for ($j = 0; $j < 8; $j++) {
            if ($crc & 0x8000) {
                $crc = ($crc << 1) ^ $poly;
            } else {
                $crc <<= 1;
            }
            $crc &= 0xFFFF;
        }
    }

    return $crc;
}

// 示例用法
$hexData = "0A09020103";
$byteArray = hexToByteArray($hexData);
echo "<br>CRC-16(MSB-LSB)值为: ".$byteArray."\n";
$crcValue = crc16MSBLSB东方($byteArray);
echo "<br>CRC-16(MSB-LSB)值为: ".dechex($crcValue)."\n";

 ?>


http://www.kler.cn/a/442340.html

相关文章:

  • 若依分页插件失效问题
  • iOS - TLS(线程本地存储)
  • 基于机器学习的用户健康风险分类及预测分析
  • 【Block总结】掩码窗口自注意力 (M-WSA)
  • 【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)
  • 云手机技术怎么实现的?
  • Windows开机黑屏|Windows开机黑屏只有鼠标|Windows开机不运行explorer
  • vue3实现商城系统详情页(前端实现)
  • 面试真题 | 虎牙 C++[20241218]
  • 5个小型多模态AI模型及其功能
  • 使用idea创建一个JAVA WEB项目
  • 小程序子组件调用父组件方法、父组件调用子组件方法
  • clion使用说明
  • 环境搭建——CUDA、Python、Pytorch
  • 【jvm】主要参数
  • Vue.js前端框架教程6:Element UI框架
  • EDAC和 MCA检验技术
  • 【Leetcode 每日一题】1847. 最近的房间
  • 【图像处理lec2】matlab的使用
  • CLion Inlay Hints - 取消 CLion 灰色的参数和类型提示
  • 二六(vue2-02)、指令修饰符、v-bind增强、v-model补充、computed、watch、水果购物车
  • 【电源专题】开关转换器使能(EN)和欠压锁定(UVLO)为什么需要回滞?
  • opencv读取和保存图像
  • mcu+cpld 联合编程(概念及流程)
  • 【Python知识】python基础-关于异常处理
  • Ollydbg 编写脚本的一些语法及例子(OD脚本)