CMPP协议Msg_Id生成算法

图片描述

实在搞不懂怎么生成这个MsgId求大神
尝试过如下写法 不对

public function msgId($spid, $sqid)
    {
        $timeStr = time();
        echo sprintf("%02d%02d%02d%02d%02d%07d%05d", date('m', $timeStr), date('d', $timeStr), date('H', $timeStr), date('i', $timeStr), date('s', $timeStr), $spid, $sqid) , "\n";
        return sprintf("%02d%02d%02d%02d%02d%07d%05d", date('m', $timeStr), date('d', $timeStr), date('H', $timeStr), date('i', $timeStr), date('s', $timeStr), $spid, $sqid);
    }
    pack("N2C", $this->msgId($Msg_src,$header['sequence_number']), 0)
阅读 4.4k
1 个回答
    public function msgId($spid, $sqid)
    {
        $timeStr = time();
        //echo bindec(sprintf("%04s%05s%05s%06s%06s%022s%016s",decbin(date('m', $timeStr)),decbin(date('d', $timeStr)),decbin(date('H', $timeStr)),decbin(date('i', $timeStr)),decbin(date('s', $timeStr)),decbin($spid), decbin($sqid)));
        return bindec(sprintf("%04s%05s%05s%06s%06s%022s%016s",decbin(date('m', $timeStr)),decbin(date('d', $timeStr)),decbin(date('H', $timeStr)),decbin(date('i', $timeStr)),decbin(date('s', $timeStr)),decbin($spid), decbin($sqid)));
    }

    $this->msgId('600010','2');

在这里面给你纠正一下思路
第一: 64里面只能存0-1之间的数值,也就是说都是2进制数据
所以拼接一下2进制数据就好了

月份(1-12)(【0001-1100】区间 4位)decbin(date('m', $timeStr))
日(1-31)(【00001-11111】区间 5位)decbin(date('d', $timeStr))
时(1-24)(【00001-11000】区间 5位)decbin(date('H', $timeStr))
分(1-59)(【000001-111011】区间 6位)decbin(date('i', $timeStr))
秒(1-59)(【000001-111011】区间 6位)decbin(date('s', $timeStr))
网关代码(【0~0 - 1~1】22位)decbin($spid1)
// (如果这个网关代码是22位0和1组成就不用decbin,本身就是2进制了,如果不是的话,就变成二进制)
序列号(区间 16位)decbin($spid2)

网关代码多少位我没洗数,序列号,什么的位数你自己调就行了%04d%06d%05d%06d%06d【%021d%016d】<-这里 如果没算错的话是4+5+5+6+6+22+16应该是64位了,那么这64位是一个2进制的字符串,用bindec()转换成十进制的数值,存进数据库里面,那么数据库存贮的2进制数据就是符合你要的规定了,而且10进制数据,8位,64字节,完美

变量名用点心$spid, $sqid 我以为是一个

下面这种方法也是简单,逻辑上不好理解,但是还是挺简单的,学习了

$messageId = 0;
$messageId |= $m << 60;
$messageId |= $d << 55;
$messageId |= $h << 50;
$messageId |= $i << 44;
$messageId |= $s << 38;
$messageId |= $spid << 16;
$messageId |= $sqid & 0xff;
echo $messageId
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题