为了账号安全,请及时绑定邮箱和手机立即绑定

一个Java的mac校验域算法,哪位大神能帮忙改写成php版本

一个Java的mac校验域算法,哪位大神能帮忙改写成php版本

慕莱坞森 2019-03-01 10:54:05
一个Java的mac校验域算法,哪位大神能帮忙改写成php版本。报文格式:域0|域1|域2| ……|域n域n是MAC校验域 public static byte[] getMac(byte[] dt, int mlen) { int n, k, len, ilen; // original input String length len = dt.length; // 原始串和mac长度的余数 k = len % mlen; // n = mlen - k; ilen = len + n; byte[] bt = new byte[ilen]; for (int i = 0; i < len; i++) { dt[i] = (byte) (dt[i] > 0x00 ? dt[i] : dt[i] + 256); bt[i] = dt[i]; } bt[len] = 127; byte bo[] = new byte[mlen]; for (int i = 0; i < ilen;) { for (int j = 0; j < mlen; j++) { bo[j] ^= bt[i]; i++; } } for (int i = 0; i < mlen; i++) { // 如果遇到\r \n if ((bo[i] >= 0x00 ? bo[i] : bo[i] + 256) >= 0x80) { // "\r" bo[i] ^= 0x80; } if (bo[i] == 0x0d) { // "\r" bo[i] = 0x4d; } if (bo[i] == 0x0a) { // "\n" bo[i] = 0x4a; } if (bo[i] == 0x3a) { // ":" bo[i] = 0x7a; } if (bo[i] == 0x7c) { // "|" bo[i] = 0x3c; } if (bo[i] == 0x00) { // "0" bo[i] = 0x40; } } return bo; }
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

public static function getMac($dt, $mlen) {
        int $n, $k, $len, $ilen;
        // original input String length
        $len = array_length($dt);
        // 原始串和mac长度的余数
        $k = $len % $mlen;
        //
        $n = $mlen - $k;
        $ilen = $len + $n;
        $bt = [];
        for (int $i = 0; $i < $len; $i++) {
            $dt[$i] = $dt[$i] > 0x00 ? $dt[$i] : $dt[$i] + 256;
            $bt[$i] = $dt[$i];
        }
        $bt[$len] = 127;

        $bo = [];
        for ($i = 0; $i < $ilen;) {
            for ($j = 0; $j < $mlen; $j++) {
                $bo[$j] ^= $bt[$i];
                $i++;
            }
        }

        for ($i = 0; $i < $mlen; $i++) {
            // 如果遇到\r \n

            if (($bo[$i] >= 0x00 ? $bo[$i] : $bo[$i] + 256) >= 0x80) { // "\r"
                $bo[$i] ^= 0x80;
            }

            if ($bo[$i] == 0x0d) { // "\r"
                $bo[$i] = 0x4d;
            }
            if ($bo[$i] == 0x0a) { // "\n"
                $bo[$i] = 0x4a;
            }
            if ($bo[$i] == 0x3a) { // ":"
                $bo[$i] = 0x7a;
            }
            if ($bo[$i] == 0x7c) { // "|"
                $bo[$i] = 0x3c;
            }
            if ($bo[$i] == 0x00) { // "0"
                $bo[$i] = 0x40;
            }

        }
        return $bo;
    }

以上是直接翻译,以下是写得更好得:
public static function getMac($dt, $mlen) {
        int $n, $k, $len, $ilen;
        // original input String length
        $len = array_length($dt);
        // 原始串和mac长度的余数
        $k = $len % $mlen;
        //
        $n = $mlen - $k;
        $ilen = $len + $n;
        $bt = [];
       
        $bt[$len] = 127;
        foreach($dt as $key => &$value) {
            $value = $value > 0x00 ? $value : $value + 256;
            $bt[$i] = $value;
        }
        unset($value);
        
        $bo = [];
        foreach($bt as $value) {
            for($j = 0; $j < $mlen; $j++) {
                $bo[$j] ^= $value;
            }
        }

        unset($value);
        foreach($bo as &$value) {
            // 如果遇到\r \n

            if (($value >= 0x00 ? $value : $value + 256) >= 0x80) { // "\r"
                $value ^= 0x80;
            }
            switch($value) {
                case 0x0d:// "\r"
                    $value = 0x4d;
                    break;
                case 0x0a:// "\n"
                    $value = 0x4a;
                    break;
                case 0x3a:// ":"
                    $value = 0x7a;
                    break;
                case 0x7c:// "|"
                    $value = 0x3c;
                    break;
                case 0x00:// "0"
                    $value = 0x40;
                    break;
            }
        }
        return $bo;
    }
查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 540 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号