国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

硬件對(duì)接crc效驗(yàn)

IT球球

截圖
有大佬知道這種效驗(yàn)怎么實(shí)現(xiàn)嗎,找了很多網(wǎng)上代碼效驗(yàn)都不正確

1507 4 2
4個(gè)回答

li914

根據(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);

不知道這樣子是否正確

  • li914 2022-06-01

    注意: 根據(jù)Java示例,數(shù)組中的數(shù)字,不能大于 127,不能小于 -128

  • IT球球 2022-06-01

    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能幫我是試一下這一串看是否一樣嗎,大佬

  • li914 2022-06-01

    這是16進(jìn)制的字符串? 要試什么?

  • li914 2022-06-01

    我只是小垃圾一個(gè) 不是大佬

  • IT球球 2022-06-01

    他現(xiàn)在就是想把這個(gè)16進(jìn)制用這個(gè)方式效驗(yàn),但是我一直效驗(yàn)不對(duì),你能幫我看看java和php用你這2塊代碼一樣嗎

  • li914 2022-06-01

    不是很明白你是要怎么效驗(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

  • IT球球 2022-06-01

    謝謝了,我這邊在處理一下,這個(gè)文檔有問題,他們需要CRC-16/XMODEM效驗(yàn),文檔沒跟新

  • li914 2022-06-01

    呃呃呃 好吧

  • IT球球 2022-06-01

    能把你那個(gè)php 十六進(jìn)制字符串,然后轉(zhuǎn) 十進(jìn)制數(shù)字?jǐn)?shù)組 最后輸出39216那個(gè)代碼發(fā)一下嗎兄弟

  • IT球球 2022-06-01

    能把你php 那個(gè) 轉(zhuǎn)10進(jìn)制數(shù)組代碼給我看看嗎

  • li914 2022-06-01

    呃呃呃 只是簡(jiǎn)單的轉(zhuǎn)換 等一下

  • IT球球 2022-06-01

    找到代碼啦,謝謝兄弟了

  • li914 2022-06-01

    已經(jīng)放到代碼里了

  • IT球球 2022-06-01

    感謝

2548a

我按我理解給你翻譯了一下,正常來說應(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;
}

  • 暫無評(píng)論

有個(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;
    }
}
  • 暫無評(píng)論
Gin
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)目這樣用的,可用

  • 暫無評(píng)論
年代過于久遠(yuǎn),無法發(fā)表回答
??