有大佬知道這種效驗(yàn)怎么實(shí)現(xiàn)嗎,找了很多網(wǎng)上代碼效驗(yàn)都不正確
根據(jù)java示例,測(cè)試的代碼:
public class Demo {
public static void main(String[] args) {
byte[] bytes = {1,2,3};
System.out.println(getCRC(bytes)); // 結(jié)果:24881
}
public static int getCRC(byte[] bytes)
{
int crc = 0x0000;
int polynomial = 0x1021;
for (byte b : bytes){
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i)&1)==1);
boolean c15 = ((crc >> 15 &1)==1);
crc <<=1 ;
if (c15^bit)crc^=polynomial;
}
}
crc &= 0xffff;
return crc;
}
}
然后根據(jù)java示例轉(zhuǎn)PHP代碼:
function getCRC($arr)
{
$crc = 0x0000;
$polynomial = 0x1021;
foreach ($arr AS $b){
for ($i=0;$i<8;$i++){
$bit = (($b>>(7-$i)&1)==1);
$c15 = (($crc>>15 & 1)==1);
$crc<<=1;
if ($c15^$bit)$crc^=$polynomial;
}
}
$crc &= 0xffff;
return $crc;
}
//$arr1 = array();
//$str1 = '688c02340c32303231303830333130313000a135220531171637';
//$len = mb_strlen($str1);
//for ($j=0;$j<($len/2);$j++){
// array_push($arr1,hexdec(mb_substr($str1,($j*2),2)));
//}
//echo implode(',',$arr1).PHP_EOL;
$str = '68 8c 02 34 0c 32 30 32 31 30 38 30 33 31 30 31 30 00 a1 35 22 05 31 17 16 37';
$strArr = explode(' ',$str);
$arr = array();
foreach ($strArr AS $value){
array_push($arr,hexdec($value));
}
echo implode(',',$arr).PHP_EOL;
echo getCRC($arr);
不知道這樣子是否正確
68 8c 02 34 0c 32 30 32 31 30 38 30 33 31 30 31 30 00 a1 35 22 05 31 17 16 37能幫我是試一下這一串看是否一樣嗎,大佬
他現(xiàn)在就是想把這個(gè)16進(jìn)制用這個(gè)方式效驗(yàn),但是我一直效驗(yàn)不對(duì),你能幫我看看java和php用你這2塊代碼一樣嗎
不是很明白你是要怎么效驗(yàn)
我拿你給的十六進(jìn)制字符串,然后轉(zhuǎn) 十進(jìn)制數(shù)字?jǐn)?shù)組 ,java和php返回結(jié)果是一樣的
數(shù)組:104,140,2,52,12,50,48,50,49,48,56,48,51,49,48,49,48,0,161,53,34,5,49,23,22,55
結(jié)果:39216
能把你那個(gè)php 十六進(jìn)制字符串,然后轉(zhuǎn) 十進(jìn)制數(shù)字?jǐn)?shù)組 最后輸出39216那個(gè)代碼發(fā)一下嗎兄弟
我按我理解給你翻譯了一下,正常來說應(yīng)該是跟java版一樣的
public function getCRC(array $bytes){
$crc = 0x0000;
$polynomial = 0x1021;
foreach ($bytes as $b){
for ($i = 0 ; $i<8;$i++){
$bit = (($b >>(7-$i)& 1 )=== 1);
$c15 = (($crc >>15 &1 ) === 1);
$crc <<=1;
if ($c15^$bit){
$crc^= $polynomial;
}
}
}
$crc &= 0xfff;
return $crc;
}
有個(gè)crc16類 你試試能不能用,里面有CRC16的XMODEM校驗(yàn)方法
class Crc16
{
/**
* CRC-16/IBM
* @param $str
* @return mixed
*/
public static function IBM($str)
{
return self::hash($str, 0x8005, 0, 0, true, true);
}
/**
* CRC-16/MAXIM
* @param $str
* @return mixed
*/
public static function MAXIM($str)
{
return self::hash($str, 0x8005, 0, 0xffff, true, true);
}
/**
* CRC-16/USB
* @param $str
* @return mixed
*/
public static function USB($str)
{
return self::hash($str, 0x8005, 0xffff, 0xffff, true, true);
}
/**
* CRC-16/MODBUS
* @param $str
* @return mixed
*/
public static function MODBUS($str)
{
return self::hash($str, 0x8005, 0xffff, 0, true, true);
}
/**
* CRC-16/CCITT
* @param $str
* @return mixed
*/
public static function CCITT($str)
{
return self::hash($str, 0x1021, 0, 0, true, true);
}
/**
* CRC-16/CCITT-FALSE
* @param $str
* @return mixed
*/
public static function CCITT_FALSE($str)
{
return self::hash($str, 0x1021, 0xffff, 0, false, false);
}
/**
* CRC-16/X25
* @param $str
* @return mixed
*/
public static function X25($str)
{
return self::hash($str, 0x1021, 0xffff, 0xffff, true, true);
}
/**
* CRC-16/XMODEM
* @param $str
* @return mixed
*/
public static function XMODEM($str)
{
return self::hash($str, 0x1021, 0, 0, false, false);
}
/**
* CRC-16/DNP
* @param $str
* @return mixed
*/
public static function DNP($str)
{
return self::hash($str, 0x3d65, 0, 0xffff, true, true);
}
/**
* 將一個(gè)字符按比特位進(jìn)行反轉(zhuǎn) eg: 65 (01000001) --> 130(10000010)
* @param $char
* @return string $char
*/
private static 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);
}
/**
* 將一個(gè)字節(jié)流按比特位反轉(zhuǎn) eg: 'AB'(01000001 01000010) --> '\x42\x82'(01000010 10000010)
* @param $str
* @return mixed
*/
private static function reverseString($str)
{
$m = 0;
$n = strlen($str) - 1;
while ($m <= $n) {
if ($m == $n) {
$str[$m] = self::reverseChar($str[$m]);
break;
}
$ord1 = self::reverseChar($str[$m]);
$ord2 = self::reverseChar($str[$n]);
$str[$m] = $ord2;
$str[$n] = $ord1;
$m++;
$n--;
}
return $str;
}
/**
* @param string $str 待校驗(yàn)字符串
* @param int $polynomial 二項(xiàng)式
* @param int $initValue 初始值
* @param int $xOrValue 輸出結(jié)果前異或的值
* @param bool $inputReverse 輸入字符串是否每個(gè)字節(jié)按比特位反轉(zhuǎn)
* @param bool $outputReverse 輸出是否整體按比特位反轉(zhuǎn)
* @return int
*/
public static function hash($str, $polynomial, $initValue, $xOrValue,
$inputReverse = false, $outputReverse = false)
{
$crc = $initValue;
for ($i = 0; $i < strlen($str); $i++) {
if ($inputReverse) {
// 輸入數(shù)據(jù)每個(gè)字節(jié)按比特位逆轉(zhuǎn)
$c = ord(self::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) {
// 把低地址存低位,即采用小端法將整數(shù)轉(zhuǎn)換為字符串
$ret = pack('cc', $crc & 0xff, ($crc >> 8) & 0xff);
// 輸出結(jié)果按比特位逆轉(zhuǎn)整個(gè)字符串
$ret = self::reverseString($ret);
// 再把結(jié)果按小端法重新轉(zhuǎn)換成整數(shù)
$arr = unpack('vshort', $ret);
$crc = $arr['short'];
}
return $crc ^ $xOrValue;
}
}
private function crc16($string){
$string = pack('H*', $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;
}
}
}
$high8 = str_pad(dechex(floor($crc / 256)), 2, '0', STR_PAD_LEFT);
$low8 = str_pad(dechex($crc % 256), 2, '0', STR_PAD_LEFT);
return [strtoupper($high8), strtoupper($low8)];
}
我項(xiàng)目這樣用的,可用